自定义栈I:数组实现
通过上面的内容,我们知道了栈属于逻辑结构,因此它的实现方式就可以有很多种了,比如数组的实现方式或者是链表的实现方式。那么我们就先用数组实现一下,栈的主要方法有:
① 定义结构
那么我们先来定义它的结构:
public class MyStack<E> { private Object[] value = null; // 栈存储容器 private int top = -1; // 栈顶(的指针) private int maxSize = 0; // 栈容量 // 构造函数(初始化默认容量) MyStack() { this.maxSize = 10;value=new Object[9]; } // 有参构造函数 MyStack(int initSize) throws Exception { if (initSize <= 0) { throw new Exception("栈容量必须大于 0"); } else { value = new Object[initSize]; maxSize = initSize; top = -1; } } }
其中栈中数据会存储在 Object[] value
数组中,top
变量代表栈顶的指针,它其实存储的是栈顶元素的下标,会随着入栈不断变化(后进先出),maxSize
表示栈的最大容量。
② 入栈
此方法是给栈添加数据的,实现代码如下:
// 入栈(数据添加) public boolean push(E e) throws Exception { if (maxSize - 1 == top) { throw new Exception("入栈失败,栈已满"); } else { value[++top] = e; return true; } }
每次当有数据插入时,只需在数组中添加一个值,并将栈顶的下标 +1 即可。
入栈操作如下图所示:
③ 出栈
此方法是删除栈中的数据的,实现代码如下:
// 数据移除(出栈) public E pop() throws Exception { if (top <= -1) { throw new Exception("移除失败,栈中已无数据"); } else { return (E) value[top--]; } }
出栈只需删除数组中栈顶数据(最后加入的数据),并修改栈顶下标 -1 即可。
出栈操作如下图所示:
④ 数据查询
除了以上操作方法之外,我们还需要添加一个查询栈顶数据的方法:
// 数据查询 public E peep() throws Exception { if (top <= -1) { throw new Exception("移除失败,栈中已无数据"); } else { return (E) value[top]; } }
⑤ 代码测试
到此为止栈的数据结构就已经实现完了,接下来我们来测试一下:
// 代码测试 public static void main(String[] args) throws Exception { MyStack stack = new MyStack(10); stack.push("Hello"); stack.push("Java"); System.out.println(stack.peep()); stack.pop(); System.out.println(stack.pop()); }
以上程序的执行结果为:
Java
Hello
从上述代码可以看出,我们添加栈的顺序是 Hello
、Java
而输出的顺序是 Java
、 Hello
符合栈的定义(后进先出)。