栈
栈(Stack)是限定在表尾进行插入和删除操作的线性表。栈又称为后进先出(Last In First Out)的线性表,简称 LIFO 结构。
# 存储结构
栈也可以有两种存储结构:
顺序存储结构:可用 (一维数组)。
顺序存储结构还可以使用两栈共享空间的方式,但仅适用于一些一个栈增加,另一个栈减少的场景。(如定量的股票买卖)
链式存储结构:简称为链栈。
存储结构 | 操作 | 时间复杂度 | 应用场景 |
---|---|---|---|
顺序存储结构 | 进栈与出栈 | O(1) | 栈的大小可预测,使用顺序存储好些 |
链式存储结构 | 进栈与出栈 | O(1) | 栈内元素变化莫测,栈大小可能很大,可能很小,则使用链栈好些 |
# 栈的实现
JavaScript 中没有栈的数据结构,但是可以用数组实现栈的所有功能。
# 抽象数据类型定义
- ADT 栈(Stack)
- Data
- 同线性表,相邻元素具有前驱和后继关系
- Operation
- InitStack(*S): 初始化操作,建立一个空栈 S。
- DestroyStack(*S): 若栈存在,则销毁它。
- Clear(*S): 清空栈。
- Peek(S, *e): 若栈存在且非空,用 e 返回 S 的栈顶元素。
- Push(*S, e): 若栈 S 存在,插入新元素 e 到栈 S 中并成为栈底元素。
- Pop(*S, *e): 删除栈 S 中栈顶元素,并用 e 返回其值。
- length(S): 返回栈 S 的元素个数。
- Data
- endADT
function Stack() {
this.dataStore = []; // 初始化一个空数组来保存
this.top = 0;
this.push = push;
this.pop = pop;
this.peek = peek;
this.clear = clear;
this.length = length;
}
function push(element) {
this.dataStore[this.top++] = element;
}
function peek() {
return this.dataStore[this.top-1];
}
function pop() {
return this.dataStore[--this.top];
}
function clear() {
this.top = 0;
}
function length() {
return this.top;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 栈的应用
符合后进先出的场景都可以使用栈来解决。
← 抽象数据类型(ADT) 队列 →