1. lower-case nouns

2. fix 2 figures
3. Replace some 「」 by “”
This commit is contained in:
krahets
2023-08-20 23:28:30 +08:00
parent 2626de8d0b
commit 981144e42d
48 changed files with 174 additions and 162 deletions

View File

@@ -1,16 +1,17 @@
# 栈
「栈 Stack」是一种遵循先入后出First In, Last Out原则的线性数据结构。
「栈 stack」是一种遵循先入后出的逻辑的线性数据结构。
我们可以将栈类比为桌面上的一摞盘子,如果需要拿出底部的盘子,则需要先将上面的盘子依次取出。我们将盘子替换为各种类型的元素(如整数、字符、对象等),就得到了栈数据结构。
在栈中,我们把堆叠元素的顶部称为栈顶,底部称为栈底。将把元素添加到栈顶的操作叫做入栈,而删除栈顶元素的操作叫做出栈
在栈中,我们把堆叠元素的顶部称为栈顶,底部称为栈底。将把元素添加到栈顶的操作叫做入栈,而删除栈顶元素的操作叫做出栈
![栈的先入后出规则](stack.assets/stack_operations.png)
## 栈常用操作
栈的常用操作如下表所示,具体的方法名需要根据所使用的编程语言来确定。在此,我们以常见的 `push()` , `pop()` , `peek()` 命名为例。
<p align="center"> 表:栈的操作效率 </p>
| 方法 | 描述 | 时间复杂度 |
@@ -19,7 +20,7 @@
| pop() | 栈顶元素出栈 | $O(1)$ |
| peek() | 访问栈顶元素 | $O(1)$ |
通常情况下,我们可以直接使用编程语言内置的栈类。然而,某些语言可能没有专门提供栈类,这时我们可以将该语言的数组」或「链表视作栈来使用,并通过“脑补”来忽略与栈无关的操作。
通常情况下,我们可以直接使用编程语言内置的栈类。然而,某些语言可能没有专门提供栈类,这时我们可以将该语言的数组”或“链表视作栈来使用,并在程序逻辑上忽略与栈无关的操作。
=== "Java"
@@ -377,7 +378,7 @@
### 基于数组的实现
在基于「数组实现栈时,我们可以将数组的尾部作为栈顶。在这样的设计下,入栈与出栈操作就分别对应在数组尾部添加元素与删除元素,时间复杂度都为 $O(1)$ 。
使用数组实现栈时,我们可以将数组的尾部作为栈顶。在这样的设计下,入栈与出栈操作就分别对应在数组尾部添加元素与删除元素,时间复杂度都为 $O(1)$ 。
=== "ArrayStack"
![基于数组实现栈的入栈出栈操作](stack.assets/array_stack.png)
@@ -489,5 +490,5 @@
## 栈典型应用
- **浏览器中的后退与前进、软件中的撤销与反撤销**。每当我们打开新的网页,浏览器就会将上一个网页执行入栈,这样我们就可以通过后退操作回到上一页面。后退操作实际上是在执行出栈。如果要同时支持后退和前进,那么需要两个栈来配合实现。
- **浏览器中的后退与前进、软件中的撤销与反撤销**。每当我们打开新的网页,浏览器就会将上一个网页执行入栈,这样我们就可以通过后退操作回到上一页面。后退操作实际上是在执行出栈。如果要同时支持后退和前进,那么需要两个栈来配合实现。
- **程序内存管理**。每次调用函数时,系统都会在栈顶添加一个栈帧,用于记录函数的上下文信息。在递归函数中,向下递推阶段会不断执行入栈操作,而向上回溯阶段则会执行出栈操作。