栈是一种先进后出的数据结构。在计算机中有好多处用到栈,例如:文本编译器中的undo操作、计算机系统中的递归调用、JVM中方法的执行中、括号匹配算法等都会用到栈这种数据结构。在这次博客中,使用上次封装的Array数组来实现自己的栈。资源跳转:玩转数据结构>封装自己的Array数组
1、栈的接口
public interface Stack<E> { int getSize(); void push(E e); E pop(); E peek(); boolean isEmpty(); }
2、实现栈
public class ArrayStack<E> implements Stack<E> { private Array<E> array; public ArrayStack() {//默认容量为10 this(10); } public ArrayStack(int capacity) { array = new Array<E>(capacity); } @Override public int getSize() { return array.getSize(); } @Override public void push(E e) {//在数组最后添加元素,时间复杂度为O(1) array.addLast(e); } @Override public E pop() { return array.removeLast(); } @Override public E peek() { return array.getLast(); } @Override public boolean isEmpty() { return array.isEmpty(); } @Override public String toString() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(String.format("ArrayStack:size=%d, capacity=%d ",array.getSize(), array.getCapacity())); stringBuilder.append("["); for (int i = 0; i < array.getSize(); i++) { stringBuilder.append(array.get(i)); if(i != array.getSize() - 1) { stringBuilder.append(","); } } stringBuilder.append("] top"); return stringBuilder.toString(); } }
3、测试
public static void main(String[] args) { ArrayStack<Integer> arrayStack = new ArrayStack<Integer>(); System.out.println("入栈:"); for (int i = 0; i < 10; i++) { System.out.print(i + " "); arrayStack.push(i); } System.out.println("\n出栈:"); for (int i = 0; i < 10; i++) { System.out.print(arrayStack.pop() + " "); } }
4、结果
入栈: 0 1 2 3 4 5 6 7 8 9 出栈: 9 8 7 6 5 4 3 2 1 0在实现栈时,入栈和出栈都是在数组的尾部进行的,因为不用进行数据的移动,因此数组的尾部操作时间复杂度为0(1)。