双端队列与受限序列判定
这一节的题型和 3.1.1 出栈序列同源:给一个输入序列和一种受限结构,问哪个输出序列得不到。 教材【命题追踪】列了「双端队列出队/入队操作模拟」(2010、2021),两道都是输出受限的双端队列;另有 2018 一道「队列 + 栈」的组合。教材提示框原话:「实际双端队列的考题不会这么复杂,通常仅判断序列是否满足题设条件,代入验证即可。」
机制
双端队列是指允许两端都可以进行插入和删除操作的线性表。两端的地位是平等的,为了方便理解,左端也视为前端,右端也视为后端。
- 入队时:前端进的元素排列在队列中后端进的元素的前面,后端进的元素排列在前端进的元素的后面。
- 出队时:无论前端还是后端出队,先出的元素排列在后出的元素的前面。
| 受限方式 | 定义 |
|---|---|
| 输出受限的双端队列 | 允许在一端进行插入和删除,但另一端只允许插入 |
| 输入受限的双端队列 | 允许在一端进行插入和删除,但另一端只允许删除 |
若限定双端队列从某个端点插入的元素只能从该端点删除,则该双端队列就蜕变为两个栈底相邻接的栈。
教材例:输入序列
| 结构 | 可得到的输出序列数 | 独有的 / 得不到的 |
|---|---|---|
| 栈 | 14(卡特兰数 | — |
| 输入受限的双端队列 | 22 | 独有 |
| 输出受限的双端队列 | 22 | 独有 |
| 两者都得不到 | — |
输入受限:设 end1 端可进可出、end2 端只能出。从 end1 输入、end1 输出相当于栈(14 种);从 end2 输出相当于队列。两端混合输出可以再得到剩下 10 种中的 8 种。输出受限的分析类似。上表已用程序穷举复核。
手算模板
看第一个输出的元素
| 结构 | 比 | 这些元素之后的出队次序必须满足 |
|---|---|---|
| 输入受限(一端入,两端出) | 保持入队顺序排成一列 | 每次取的都是剩下的元素中最早或最晚入队的那个(从两端取) |
| 输出受限(两端入,一端出) | 左入的在左、逆序;右入的在右、顺序。从出口端看,入队序号先减后增,最早入队的在谷底 | 按排列从出口端依次出队,即先减后增 |
| 栈 | 按入栈顺序叠放 | 逆序(即 3.1.1 的判定准则) |
这是必要条件:
2010:元素
2021:一端仅能入队、另一端既能入队又能出队(仍是输出受限),入队序列
3.2.5 第 19 题:既不能由输入受限、也不能由输出受限的双端队列得到的是 C:
其他组合结构
同一个思路适用于任何「几个容器组合」的题:先写出每个容器内部的顺序规则(栈逆序、队列顺序),再看第一个输出的元素迫使哪些元素留在哪个容器里。
| 题 | 结构 | 不能得到 | 理由 |
|---|---|---|---|
| 2018 | 队列 Q 中依次为 | C: | 首先输出 3,说明 1 和 2 已先后入栈,此后 2 一定比 1 先输出 |
| 3.2.5 第 18 题 | 输入 | B: | 5 最先输出,它所在的队列必须为空;而 1、2 已入队,1 最后输出又要求 2、3、4 都不和 1 同队,两个队列都不空,矛盾 |
边界
| 说法 | 判断 | 说明 |
|---|---|---|
| 「输出受限就是一端只能出队」 | ❌ | 是一端可进可出、另一端只能入。出口只有一个 |
| 「输入受限就是一端只能入队」 | ❌ | 是一端可进可出、另一端只能出。入口只有一个 |
| 「2010 和 2021 分别考输出受限和输入受限」 | ❌ | 两道都是输出受限:2010 两端都能入队、只有一端能出队;2021 一端只能入队、另一端可进可出 |
| 「双端队列能得到全部 | ❌ | 受限的双端队列不能, |
| 「双端队列两端插入删除的规则不同」 | ❌ | 两端地位平等;受限的双端队列才有区别 |
| 「限定从某端插入的元素只能从该端删除,双端队列仍是队列」 | ❌ | 蜕变为两个栈底相邻接的栈 |
考点
- 输入受限 / 输出受限的定义,不要按字面反过来理解。
- 第一个输出元素的检查:输入受限从两端取、输出受限先减后增。
- 2010、2021:输出受限;2018:队列 + 栈。
- 考题一般只要求代入验证,不要求像教材例题那样列出全部序列。
链接
- 🏠 返回总览:数据结构第 1~4 章总览
- ⬅️ 上一节:3.2.1~3.2.3 队列与循环队列
- ➡️ 下一节:3.3 栈和队列的应用
- 🔗 同源题型:3.1.1 出栈序列:合法性判定与卡特兰数计数(栈的判定准则、
) - 📖 名词库:第 1~4 章名词库