Java数据结构:栈的实现

本文详细介绍了Java语言中栈的数据结构实现,包括基本方法及注意事项,并通过实例展示了使用数组实现栈的操作过程。

栈是Java语言中最重要的数据结构之一,它的实现,至少应该包括以下几个方法:

  1. pop() 出栈操作,弹出栈顶元素。
  2. push(E e) 入栈操作
  3. peek() 查看栈顶元素
  4. isEmpty() 栈是否为空

另外,实现一个栈,还应该考虑到几个问题:

  1. 栈的初始大小以及栈满以后如何新增栈空间
  2. 对栈进行更新时需要进行同步

简单示例,使用数组实现栈,代码如下:

  1. <pre name="code" class="java">public class Stack<E> {  
  2.  
  3.     // Java 不支持泛型数组,如需使用,请使用Java提供的容器  
  4.     private Object[] stack;  
  5.  
  6.     // 栈的默认初始大小  
  7.     private static final int INIT_SIZE = 2;  
  8.  
  9.     // 栈顶索引  
  10.     private int index;  
  11.  
  12.     public Stack() {  
  13.         stack = new Object[INIT_SIZE];  
  14.         index = -1;  
  15.     }  
  16.  
  17.     /**  
  18.      * 构造方法  
  19.      *   
  20.      * @param initSize  
  21.      *            栈的初始大小  
  22.      */ 
  23.     public Stack(int initSize) {  
  24.         if (initSize < 0) {  
  25.             throw new IllegalArgumentException();  
  26.         }  
  27.         stack = new Object[initSize];  
  28.         index = -1;  
  29.     }  
  30.  
  31.     /**  
  32.      * 出栈操作  
  33.      *   
  34.      * @return 栈顶对象  
  35.      */ 
  36.     public synchronized E pop() {  
  37.         if (!isEmpty()) {  
  38.             E temp = peek();  
  39.             stack[index--] = null;  
  40.             return temp;  
  41.         }  
  42.         return null;  
  43.     }  
  44.  
  45.     /**  
  46.      * 入栈操作  
  47.      *   
  48.      * @param obj  
  49.      *            等待入栈的对象  
  50.      */ 
  51.     public synchronized void push(E obj) {  
  52.         if (isFull()) {  
  53.             Object[] temp = stack;  
  54.             // 如果栈满,则创建空间为当前栈空间两倍的栈  
  55.             stack = new Object[2 * stack.length];  
  56.             System.arraycopy(temp, 0, stack, 0, temp.length);  
  57.         }  
  58.         stack[++index] = obj;  
  59.     }  
  60.  
  61.     /**  
  62.      * 查看栈顶对象  
  63.      *   
  64.      * @return 栈顶对象  
  65.      */ 
  66.     public E peek() {  
  67.         if (!isEmpty()) {  
  68.             return (E) stack[index];  
  69.         }  
  70.         return null;  
  71.     }  
  72.  
  73.     /**  
  74.      * 查看栈是否为空  
  75.      *   
  76.      * @return 如果栈为空返回true,否则返回false  
  77.      */ 
  78.     public boolean isEmpty() {  
  79.         return index == -1;  
  80.     }  
  81.  
  82.     /**  
  83.      * 查看栈是否满  
  84.      *   
  85.      * @return 如果栈满返回true,否则返回false  
  86.      */ 
  87.     public boolean isFull() {  
  88.         return index >= stack.length - 1;  
  89.     }  
  90. }  

最后说明,Java中实现了栈(java.util.Stack)的数据结构,它是通过继承Vector类实现的,一般情况下我们直接拿来用就行了。

关于的使用,内有关于使用的示例 的应用举例 1. 将10进制正整数num转换为n进制 private String conversion(int num, int n) { MyStack myStack = new MyArrayStack(); Integer result = num; while (true) { // 将余数入 myStack.push(result % n); result = result / n; if (result == 0) { break; } } StringBuilder sb = new StringBuilder(); // 按出的顺序倒序排列即可 while ((result = myStack.pop()) != null) { sb.append(result); } return sb.toString(); } 2. 检验符号是否匹配. '['和']', '('和')'成对出现时字符串合法. 例如"[][]()", "[[([]([])()[])]]"是合法的; "([(])", "[())"是不合法的. 遍历字符串的每一个char, 将char与顶元素比较. 如果char和顶元素配对, 则char不入, 否则将char入. 当遍历完成时为空说明字符串是合法的. public boolean isMatch(String str) { MyStack myStack = new MyArrayStack(); char[] arr = str.toCharArray(); for (char c : arr) { Character temp = myStack.pop(); // 为空时只将c入 if (temp == null) { myStack.push(c); } // 配对时c不入 else if (temp == '[' && c == ']') { } // 配对时c不入 else if (temp == '(' && c == ')') { } // 不配对时c入 else { myStack.push(temp); myStack.push(c); } } return myStack.isEmpty(); } 3. 行编辑: 输入行中字符'#'表示退格, '@'表示之前的输入全都无效. 使用保存输入的字符, 如果遇到'#'就将顶出, 如果遇到@就清空. 输入完成时将中所有字符出后反转就是输入的结果: private String lineEdit(String input) { MyStack myStack = new MyArrayStack(); char[] arr = input.toCharArray(); for (char c : arr) { if (c == '#') { myStack.pop(); } else if (c == '@') { myStack.clear(); } else { myStack.push(c); } } StringBuilder sb = new StringBuilder(); Character temp = null; while ((temp = myStack.pop()) != null) { sb.append(temp); } // 反转字符串 sb.reverse(); return sb.toString(); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值