< Back to Blog
#Data Structure#Computer Science#408

队列的实现方式——从约束条件到决策树

Tech Sharing513 words

最近回顾数据结构,发现自己在逻辑结构和物理结构的对应关系选择中总是做错,上网搜了搜方法也没有比较易于理解的方法,于是自己做了个决策树建模,有一个大致的印象,理清楚不少思路。

决策树图

决策树中的关键约束

在画这棵树时,我固定了以下几个判断维度(也是 408 的高频考点):

  1. 存储方式:顺序 / 链式
  2. 是否循环:解决“假溢出”与“双端访问”
  3. 链表类型:单向 / 双向
  4. 指针设置:头指针 / 尾指针 / 头尾双指针
  5. 头结点:是否引入哨兵结点简化边界

其中最关键的一条经验是:

非循环结构必须头尾双指针;循环结构才有可能只用一个指针。

各类实现的性能指标对比

实现方式 判空 判满 入队 出队 空间开销 推荐度
顺序循环队列 front == rear (rear+1)%M == front O(1) O(1) 低 ⭐⭐⭐
非循环单链 + 头+尾(带头) front->next == NULL 无 O(1) O(1) 中 ⭐⭐⭐
非循环单链 + 头+尾(无头) front == NULL 无 O(1) O(1) 中 ⭐⭐
循环单链 + 仅尾指针 ⭐ rear->next == rear 无 O(1) O(1) 最低 ⭐⭐⭐⭐⭐
循环双链 + 仅尾指针 rear->next == rear 无 O(1) O(1) 高 ⭐⭐⭐
循环双链 + 头+尾 front == NULL 无 O(1) O(1) 最高 ⭐⭐

一个容易忽视的细节:头结点

头结点并不是为了“省时间”或“省空间”,而是为了消除空队列的特殊性:

  • 链队:删空后容易涉及 rear 悬空,带头结点更安全。
  • 链栈:操作单一,top == NULL 已足够清晰,不带头结点更简洁。
  • 循环链队:闭环结构天然解决了边界问题,通常不需要头结点。

栈的物理和逻辑关系

栈分为 顺序栈(数组实现)和 链栈(单链表)

用双链表完全没有必要,太过剩了,而且栈的最佳选择是唯一的,也就是下面的这种情况:

  • 操作在表头
  • 只有头指针
  • 不带头结点
  • 单向
  • 非循环
Copyright
  • Author:Mark Xu
  • Copyright:All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating otherwise.

© 2026 Mark Xu. All rights reserved.

All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating otherwise.

A small site built with React + Vite + Tailwind