https://zhuanlan.zhihu.com/p/712672052
数据结构之栈
定义
底层依赖的是静态数组
实现的,靠resize来解决固定容量问题
栈是一个后进先出(Last In Fist Out, LIFO)的线性表,它要求只在表尾进行删除和插入操作。
所谓的栈,其实就是一个特殊的线性表(顺序表、链表),但是它在操作上有一些特殊的要求和限制:
- 栈的元素必须“后进先出”
- 栈的操作只能在这个线性表的表尾进行。
- 对于栈来说,这个表尾称为栈的栈顶(top),相应的表头称为栈底(bottom)。
栈的插入和删除操作:
栈的插入操作(Push),叫做进栈,也称为压栈,入栈。
栈的删除操作(Pop),叫做出栈,也称为弹栈。
因为栈的本质是一个线性表,线性表有两种存储形式,那么栈也分为栈的顺序存储结构和栈的连式存储结构。
栈的存储结构
顺序存储结构

链式存储结构

实现
定义栈的接口
1
2
3
4
5
6
7
|
public interface Stack<E>{
int getSize();
boolean isEmpty();
void push(E e);
E pop();
E peek();
}
|
基于数组实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
public class ArrayStack<E> implements Stack<E> {
private Array<E> data;
public ArrayStack(int capacity) {
data = new Array<>(capacity);
}
public ArrayStack() {
data = new Array<>();
}
@Override
public int getSize() {
return data.getSize();
}
@Override
public boolean isEmpty() {
return data.isEmpty();
}
@Override
public void push(E e) {
data.addLast(e);
}
@Override
public E pop() {
return data.removeLast();
}
@Override
public E peek() {
return data.get(data.getSize() - 1);
}
public int getCapacity(){
return data.getCapacity();
}
@Override
public String toString() {
StringBuilder strObj = new StringBuilder();
strObj.append("Stack: [");
for (int i = 0; i < data.getSize(); i++) {
strObj.append(data.get(i));
if(i!=data.getSize()-1){
strObj.append(", ");
}
}
strObj.append("] Top");
return strObj.toString();
}
}
|
应用
编辑器undo操作
系统调用栈
括号匹配