mirror of
https://github.com/krahets/hello-algo.git
synced 2025-12-16 03:59:18 +08:00
Number the H1 and H2 headings.
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 双向队列
|
||||
# 5.3. 双向队列
|
||||
|
||||
对于队列,我们只能在头部删除或在尾部添加元素,而「双向队列 Deque」更加灵活,在其头部和尾部都能执行元素添加或删除操作。
|
||||
|
||||
@@ -10,7 +10,7 @@ comments: true
|
||||
|
||||
<p align="center"> Fig. 双向队列的操作 </p>
|
||||
|
||||
## 双向队列常用操作
|
||||
## 5.3.1. 双向队列常用操作
|
||||
|
||||
双向队列的常用操作见下表(方法命名以 Java 为例)。
|
||||
|
||||
@@ -223,7 +223,7 @@ comments: true
|
||||
let isEmpty = deque.isEmpty
|
||||
```
|
||||
|
||||
## 双向队列实现
|
||||
## 5.3.2. 双向队列实现
|
||||
|
||||
双向队列需要一种可以在两端添加、两端删除的数据结构。与队列的实现方法类似,双向队列也可以使用双向链表和循环数组来实现。
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 队列
|
||||
# 5.2. 队列
|
||||
|
||||
「队列 Queue」是一种遵循「先入先出 first in, first out」数据操作规则的线性数据结构。顾名思义,队列模拟的是排队现象,即外面的人不断加入队列尾部,而处于队列头部的人不断地离开。
|
||||
|
||||
@@ -12,7 +12,7 @@ comments: true
|
||||
|
||||
<p align="center"> Fig. 队列的先入先出特性 </p>
|
||||
|
||||
## 队列常用操作
|
||||
## 5.2.1. 队列常用操作
|
||||
|
||||
队列的常用操作见下表(方法命名以 Java 为例)。
|
||||
|
||||
@@ -256,7 +256,7 @@ comments: true
|
||||
let isEmpty = queue.isEmpty
|
||||
```
|
||||
|
||||
## 队列实现
|
||||
## 5.2.2. 队列实现
|
||||
|
||||
队列需要一种可以在一端添加,并在另一端删除的数据结构,也可以使用链表或数组来实现。
|
||||
|
||||
@@ -1202,11 +1202,11 @@ comments: true
|
||||
|
||||
以上代码仍存在局限性,即长度不可变。然而,我们可以通过将数组替换为列表(即动态数组)来引入扩容机制,有兴趣的同学可以尝试实现。
|
||||
|
||||
## 两种实现对比
|
||||
## 5.2.3. 两种实现对比
|
||||
|
||||
与栈的结论一致,在此不再赘述。
|
||||
|
||||
## 队列典型应用
|
||||
## 5.2.4. 队列典型应用
|
||||
|
||||
- **淘宝订单**。购物者下单后,订单就被加入到队列之中,随后系统再根据顺序依次处理队列中的订单。在双十一时,在短时间内会产生海量的订单,如何处理「高并发」则是工程师们需要重点思考的问题。
|
||||
- **各种待办事项**。例如打印机的任务队列、餐厅的出餐队列等等。
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 栈
|
||||
# 5.1. 栈
|
||||
|
||||
「栈 Stack」是一种遵循「先入后出 first in, last out」数据操作规则的线性数据结构。我们可以将栈类比为放在桌面上的一摞盘子,如果需要拿出底部的盘子,则需要先将上面的盘子依次取出。
|
||||
|
||||
@@ -14,7 +14,7 @@ comments: true
|
||||
|
||||
<p align="center"> Fig. 栈的先入后出特性 </p>
|
||||
|
||||
## 栈常用操作
|
||||
## 5.1.1. 栈常用操作
|
||||
|
||||
栈的常用操作见下表(方法命名以 Java 为例)。
|
||||
|
||||
@@ -255,7 +255,7 @@ comments: true
|
||||
let isEmpty = stack.isEmpty
|
||||
```
|
||||
|
||||
## 栈的实现
|
||||
## 5.1.2. 栈的实现
|
||||
|
||||
为了更加清晰地了解栈的运行机制,接下来我们来自己动手实现一个栈类。
|
||||
|
||||
@@ -1023,7 +1023,7 @@ comments: true
|
||||
}
|
||||
```
|
||||
|
||||
## 两种实现对比
|
||||
## 5.1.3. 两种实现对比
|
||||
|
||||
### 支持操作
|
||||
|
||||
@@ -1048,7 +1048,7 @@ comments: true
|
||||
|
||||
综上,我们不能简单地确定哪种实现更加省内存,需要 case-by-case 地分析。
|
||||
|
||||
## 栈典型应用
|
||||
## 5.1.4. 栈典型应用
|
||||
|
||||
- **浏览器中的后退与前进、软件中的撤销与反撤销**。每当我们打开新的网页,浏览器就将上一个网页执行入栈,这样我们就可以通过「后退」操作来回到上一页面,后退操作实际上是在执行出栈。如果要同时支持后退和前进,那么则需要两个栈来配合实现。
|
||||
- **程序内存管理**。每当调用函数时,系统就会在栈顶添加一个栈帧,用来记录函数的上下文信息。在递归函数中,向下递推会不断执行入栈,向上回溯阶段时出栈。
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 小结
|
||||
# 5.4. 小结
|
||||
|
||||
- 栈是一种遵循先入后出的数据结构,可以使用数组或链表实现。
|
||||
- 在时间效率方面,栈的数组实现具有更好的平均效率,但扩容时会导致单次入栈操作的时间复杂度劣化至 $O(n)$ 。相对地,栈的链表实现具有更加稳定的效率表现。
|
||||
|
||||
Reference in New Issue
Block a user