mirror of
https://github.com/krahets/hello-algo.git
synced 2026-04-05 11:41:22 +08:00
build
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 5.3. 双向队列
|
||||
# 5.3 双向队列
|
||||
|
||||
对于队列,我们仅能在头部删除或在尾部添加元素。然而,「双向队列 Deque」提供了更高的灵活性,允许在头部和尾部执行元素的添加或删除操作。
|
||||
|
||||
@@ -10,7 +10,7 @@ comments: true
|
||||
|
||||
<p align="center"> 图:双向队列的操作 </p>
|
||||
|
||||
## 5.3.1. 双向队列常用操作
|
||||
## 5.3.1 双向队列常用操作
|
||||
|
||||
双向队列的常用操作如下表所示,具体的方法名称需要根据所使用的编程语言来确定。
|
||||
<p align="center"> 表:双向队列操作效率 </p>
|
||||
@@ -325,7 +325,7 @@ comments: true
|
||||
|
||||
```
|
||||
|
||||
## 5.3.2. 双向队列实现 *
|
||||
## 5.3.2 双向队列实现 *
|
||||
|
||||
双向队列的实现与队列类似,可以选择链表或数组作为底层数据结构。
|
||||
|
||||
@@ -3207,7 +3207,7 @@ comments: true
|
||||
}
|
||||
```
|
||||
|
||||
## 5.3.3. 双向队列应用
|
||||
## 5.3.3 双向队列应用
|
||||
|
||||
双向队列兼具栈与队列的逻辑,**因此它可以实现这两者的所有应用场景,同时提供更高的自由度**。
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ comments: true
|
||||
icon: material/stack-overflow
|
||||
---
|
||||
|
||||
# 5. 栈与队列
|
||||
# 第 5 章 栈与队列
|
||||
|
||||
<div class="center-table" markdown>
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 5.2. 队列
|
||||
# 5.2 队列
|
||||
|
||||
「队列 Queue」是一种遵循先入先出(First In, First Out)规则的线性数据结构。顾名思义,队列模拟了排队现象,即新来的人不断加入队列的尾部,而位于队列头部的人逐个离开。
|
||||
|
||||
@@ -12,7 +12,7 @@ comments: true
|
||||
|
||||
<p align="center"> 图:队列的先入先出规则 </p>
|
||||
|
||||
## 5.2.1. 队列常用操作
|
||||
## 5.2.1 队列常用操作
|
||||
|
||||
队列的常见操作如下表所示。需要注意的是,不同编程语言的方法名称可能会有所不同。我们在此采用与栈相同的方法命名。
|
||||
<p align="center"> 表:队列操作效率 </p>
|
||||
@@ -292,7 +292,7 @@ comments: true
|
||||
|
||||
```
|
||||
|
||||
## 5.2.2. 队列实现
|
||||
## 5.2.2 队列实现
|
||||
|
||||
为了实现队列,我们需要一种数据结构,可以在一端添加元素,并在另一端删除元素。因此,链表和数组都可以用来实现队列。
|
||||
|
||||
@@ -2106,7 +2106,7 @@ comments: true
|
||||
|
||||
两种实现的对比结论与栈一致,在此不再赘述。
|
||||
|
||||
## 5.2.3. 队列典型应用
|
||||
## 5.2.3 队列典型应用
|
||||
|
||||
- **淘宝订单**。购物者下单后,订单将加入队列中,系统随后会根据顺序依次处理队列中的订单。在双十一期间,短时间内会产生海量订单,高并发成为工程师们需要重点攻克的问题。
|
||||
- **各类待办事项**。任何需要实现“先来后到”功能的场景,例如打印机的任务队列、餐厅的出餐队列等。队列在这些场景中可以有效地维护处理顺序。
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 5.1. 栈
|
||||
# 5.1 栈
|
||||
|
||||
「栈 Stack」是一种遵循先入后出(First In, Last Out)原则的线性数据结构。
|
||||
|
||||
@@ -14,7 +14,7 @@ comments: true
|
||||
|
||||
<p align="center"> 图:栈的先入后出规则 </p>
|
||||
|
||||
## 5.1.1. 栈常用操作
|
||||
## 5.1.1 栈常用操作
|
||||
|
||||
栈的常用操作如下表所示,具体的方法名需要根据所使用的编程语言来确定。在此,我们以常见的 `push()` , `pop()` , `peek()` 命名为例。
|
||||
<p align="center"> 表:栈的操作效率 </p>
|
||||
@@ -290,7 +290,7 @@ comments: true
|
||||
|
||||
```
|
||||
|
||||
## 5.1.2. 栈的实现
|
||||
## 5.1.2 栈的实现
|
||||
|
||||
为了深入了解栈的运行机制,我们来尝试自己实现一个栈类。
|
||||
|
||||
@@ -1672,7 +1672,7 @@ comments: true
|
||||
}
|
||||
```
|
||||
|
||||
## 5.1.3. 两种实现对比
|
||||
## 5.1.3 两种实现对比
|
||||
|
||||
### 支持操作
|
||||
|
||||
@@ -1697,7 +1697,7 @@ comments: true
|
||||
|
||||
综上,我们不能简单地确定哪种实现更加节省内存,需要针对具体情况进行分析。
|
||||
|
||||
## 5.1.4. 栈典型应用
|
||||
## 5.1.4 栈典型应用
|
||||
|
||||
- **浏览器中的后退与前进、软件中的撤销与反撤销**。每当我们打开新的网页,浏览器就会将上一个网页执行入栈,这样我们就可以通过「后退」操作回到上一页面。后退操作实际上是在执行出栈。如果要同时支持后退和前进,那么需要两个栈来配合实现。
|
||||
- **程序内存管理**。每次调用函数时,系统都会在栈顶添加一个栈帧,用于记录函数的上下文信息。在递归函数中,向下递推阶段会不断执行入栈操作,而向上回溯阶段则会执行出栈操作。
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 5.4. 小结
|
||||
# 5.4 小结
|
||||
|
||||
- 栈是一种遵循先入后出原则的数据结构,可通过数组或链表来实现。
|
||||
- 从时间效率角度看,栈的数组实现具有较高的平均效率,但在扩容过程中,单次入栈操作的时间复杂度会降低至 $O(n)$ 。相比之下,基于链表实现的栈具有更为稳定的效率表现。
|
||||
@@ -10,7 +10,7 @@ comments: true
|
||||
- 队列是一种遵循先入先出原则的数据结构,同样可以通过数组或链表来实现。在时间效率和空间效率的对比上,队列的结论与前述栈的结论相似。
|
||||
- 双向队列是一种具有更高自由度的队列,它允许在两端进行元素的添加和删除操作。
|
||||
|
||||
## 5.4.1. Q & A
|
||||
## 5.4.1 Q & A
|
||||
|
||||
!!! question "浏览器的前进后退是否是双向链表实现?"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user