一、栈是什么?
这里引入百度百科的解释:
- 栈(stack)又名堆栈,它是一种运算受限的线性表。
- 限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。
- 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;
- 从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈上溢:栈的元素数量超出栈的容量
栈下溢:对空栈进行弹出操作
通俗的理解可以:一种先进后出的数据结构
二、栈的接口
代码如下(示例):
public interface Stack<E> {
//入栈
void push(E e);
//出栈
E pop();
//查看栈顶元素
E peek();
//返回栈中元素
int getSize();
//判断栈是否为空
boolean isEmpty();
}
三、通过动态数组实现栈的接口
动态数组的底层实现可参考:
https://blog.csdn.net/GGB__/article/details/120248300
代码如下(示例):
public class ArrayStack<E> implements Stack<E> {
private Array<E> array;
public ArrayStack(int capacity) {
array = new Array<E>(capacity);
}
public ArrayStack() {
array = new Array<>();
}
@Override
public void push(E e) {
array.addLast(e);
}
@Override
public E pop() {
return array.removeLast();
}
@Override
public E peek() {
return array.get(array.getSize() - 1);
}
@Override
public int getSize() {
return array.getSize();
}
@Override
public boolean isEmpty() {
return array.isEmpty();
}
public int getCapacity() {
return array.getCapacity();
}
@Override
public String toString() {
return "arrayStack:" + array + "入\\出栈";
}
}
四、测试
代码如下(示例):
public static void main(String[] args) {
Stack<Integer> arrayStack = new ArrayStack<>();
for (int i = 0; i < 10; i++) {
arrayStack.push(i);
}
System.out.println(arrayStack);
arrayStack.pop();
System.out.println(arrayStack);
System.out.println(arrayStack.peek());
System.out.println(arrayStack);
System.out.println(arrayStack.pop());
System.out.println(arrayStack);
}
测试结果如下(示例):
arrayStack:Array:size=10, capacity=10
[0,1,2,3,4,5,6,7,8,9]入\出栈
arrayStack:Array:size=9, capacity=10
[0,1,2,3,4,5,6,7,8]入\出栈
8
arrayStack:Array:size=9, capacity=10
[0,1,2,3,4,5,6,7,8]入\出栈
8
arrayStack:Array:size=8, capacity=10
[0,1,2,3,4,5,6,7]入\出栈