首页/数据结构/03-stack-queue-array/双端队列 🔗 在 Obsidian 中打开
数据结构 · 03-stack-queue-array

双端队列

重要度 ⭐⭐ 队列双端队列deque
速查
双端队列 = 两端都能入队、出队的线性表,是栈和队列的推广输入受限:只能一端入、两端出;输出受限:只能一端出、两端入。入队出队均 O(1)

核心概念

双端队列(Double-Ended Queue, Deque)是一种两端都可以进行入队和出队操作的线性表。

分类

  1. 输入受限的双端队列:只允许在一端入队,但两端都可以出队
  2. 输出受限的双端队列:只允许在一端出队,但两端都可以入队
输入受限的双端队列:          输出受限的双端队列:
        只能从队尾入 →              → 从队头入
   ┌──────────────────┐        ┌──────────────────┐
←  │      数据区      │ ←      │      数据区      │  →
   从队头出           从队尾出    从队尾入          只能从队尾出

存储实现

#define MaxSize 100
typedef struct {
    ElemType data[MaxSize];
    int front, rear;  // 队头和队尾指针
} Deque;

关键性质

操作普通队列双端队列
入队只能队尾队头/队尾均可
出队只能队头队头/队尾均可
表达能力受限更强
与栈和队列的关系双端队列是栈和队列的推广:只用一端操作 → 退化为;一端入、另一端出 → 退化为队列

四种基本操作:队头入队 push_front(x);队尾入队 push_back(x);队头出队 pop_front();队尾出队 pop_back()

手算示例

示例一:输入受限双端队列的出队序列

输入受限(只能从队尾入、两端都可以出),输入序列 1,2,3,4,判断哪些输出序列合法:

序列模拟结论
A. 4,1,3,21→2→3→4 入队,队尾出 4 ✓;队头出 1 ✓;队尾出 3 ✓;队尾出 2 ✓合法 ✓
B. 4,2,3,1入 1,2,3,4,队尾出 4 ✓;此时队头是 1 队尾是 3,无法出 2 ✗不合法 ✗
C. 1,2,3,4入一个出一个(队头出),退化为普通队列合法 ✓
D. 4,3,2,1全部入队后队尾依次出,退化为栈合法 ✓

示例二:判断序列合法性

输入受限,输入 1,2,3,4,问 4,2,3,1 是否合法?

  1. 入队 1,2,3,4 → 队列 [1,2,3,4](队头→队尾)
  2. 要出 4:队尾出 4 ✓ → [1,2,3]
  3. 要出 2:队头是 1,队尾是 3,都不能出 2 ✗
  4. 不合法

常见考法

题型一输入受限/输出受限双端队列,给定输入序列,判断某个输出序列是否合法(逐步模拟)。
题型二输入受限双端队列,输入 1,2,3,列举所有合法输出序列(枚举)。
题型三 · 概念双端队列、栈、队列三者的关系(推广 / 特例)。

易错点

易错清单
  1. 输入受限 ≠ 输出受限:两种受限情况的合法序列不同,不要混淆。
  2. 双端队列不能完全替代栈或队列:功能更强,实现也更复杂。
  3. 注意入队顺序固定:输入序列只能从受限的一端入,出队可选两端。
  4. 序列合法性判断要模拟:不能靠直觉,要逐步模拟入队出队。
  5. 4,2,3,1 在输入受限双端队列中不合法:常见陷阱。

核心结论

  • 双端队列两端都可入可出,是栈和队列的推广
  • 输入受限:只能一端入、两端出;输出受限:只能一端出、两端入——这是两者最核心的区别,必须记牢。
  • 输入受限双端队列的合法序列判断需要逐步模拟
  • 普通队列和栈都是双端队列的特例
  • 时间复杂度:入队出队均为 O(1)

记忆卡片

双端队列与栈和队列的关系?
双端队列是栈和队列的推广;只用一端退化为栈,一端入一端出退化为队列。
输入受限 vs 输出受限?
输入受限:只能一端入、两端出;输出受限:只能一端出、两端入。
4,2,3,1(输入 1,2,3,4)合法吗?
输入受限下不合法:出完 4 后队列 [1,2,3],队头 1 队尾 3,都出不了 2。
1,2,3,4 与 4,3,2,1 合法吗?
都合法:前者退化为队列(都从队头出),后者退化为栈(都从队尾出)。

交互动画 · 受限双端队列模拟

输入受限模式:只能队尾入(紫 r),两端可出(橘 f = 队头) f r 目标出队序列(判断合法性): 4 2 3 1 匹配成功的变橙色
输入受限双端队列:只能队尾入(紫色 r 端),队头(f)队尾都可出
目标 4,2,3,1:试试能否按顺序出队(提示:出完 4 后队列 [1,2,3],2 出不来)
「入队」把输入序列 1,2,3,4 逐个放入(输入受限只能从 r 端进);出队可与目标匹配,验证合法性。

相关知识点

(暂无关联知识点)

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。