(场景:我蹲在村口王大娘的包子铺前,看着侠客们排成长龙,突然被一道灵光砸中天灵盖……)
江湖观察日记:
王大娘的包子摊前,侠客们老老实实排成一列。新来的少林小和尚只能站队尾,而队首的唐门师姐买完包子便轻功离去——这不就是传说中的队列(Queue)吗!
队列核心心法:
- 先进先出(FIFO):先来的侠客先吃包子,后来的闻香流口水。
- 队首(Front):买包子的人所在位置(如唐门师姐的站位)。
- 队尾(Rear):新来侠客的站位(如少林小和尚的棍子尖)。
江湖比喻:
enqueue()(入队) = 侠客加入队列(如“丐帮弟子扛着打狗棒入列”)。dequeue()(出队) = 侠客买完包子离开(如“唐门师姐甩出暗器付钱,闪人!”)。peek()(查看队首) = 探头看“谁在队伍最前面”(如“小二吆喝:下一位!”)。
【第一式·四派武学·代码实战大乱斗】
(背景:我抄起四本秘籍,决定用不同门派的武功实现队列,结果……)
1. Java派·链表为剑,柔中带刚
Java的LinkedList是队列的天然载体,宛如峨眉派的软剑,灵活多变:
import java.util.LinkedList;
import java.util.Queue;
Queue<String> queue = new LinkedList<>();
queue.offer("少林弟子"); // enqueue:持棍入列(offer()如“礼貌询问能否插队”)
String front = queue.peek(); // 查看队首:谁先挨打?
String dequeued = queue.poll(); // dequeue:唐门师姐买完包子闪人(poll()如“悄悄溜走”)
Java暗语解析:
offer()vsadd():前者如“小二问:客官能挤一挤吗?”(队列满时返回false),后者如“直接掀桌子抢位!”(队列满时抛异常)。poll()vsremove():前者如“师姐轻功离去”(队列空时返回null),后者如“被掌门一掌拍出山门”(队列空时抛异常)。
2. TypeScript派·数组为盾,以静制动
TypeScript用数组模拟队列,恰似武当派的太极阵,以柔克刚:
let queue: string[] = [];
queue.push("丐帮长老"); // enqueue:打狗棒法入阵(push()如“长老稳稳站定”)
let front = queue[0]; // 查看队首:谁在阵眼?(直接取索引0)
let dequeued = queue.shift(); // dequeue:长老领完救济粮离去(shift()如“整体后撤一步”)
性能陷阱:
- TypeScript的
shift()时间复杂度为O(n),因需移动所有元素,宛如“太极阵整体后移,累得满头大汗”。 - Java的
LinkedList的poll()为O(1),因直接操作链表节点,宛如“峨眉弟子瞬移出阵,飘逸如风”。
优化方案:
- 改用
deque(双端队列)如“逍遥派凌波微步”,可左右腾挪:import { Deque } from 'collections/deque'; const queue = new Deque<string>(); queue.addBack("五毒教弟子"); // 入队:毒蛇入篓 queue.removeFront(); // 出队:弟子施毒后撤退
3. C++派·STL宝刀,一刀入魂
C++的queue容器如藏剑山庄的玄铁重剑,一刀定乾坤:
#include <queue>
std::queue<std::string> q;
q.push("明教护法"); // enqueue:圣火令入鞘(push()如“护法霸气占位”)
q.front(); // 查看队首:谁敢直视圣火?(直接访问`front()`)
q.pop(); // dequeue:护法完成任务遁入黑暗(pop()如“圣火令瞬间消失”)
C++特性:
- 底层默认用
deque实现,兼顾速度与灵活性,宛如“玄铁重剑可劈可刺”。 - 需手动管理内存,否则可能“走火入魔”(内存泄漏)。
4. Python派·双端队列,奇技百出
Python的deque如逍遥派的凌波微步,可左右腾挪:
from collections import deque
q = deque()
q.append("五毒教弟子") # enqueue:毒蛇入篓(append()如“弟子悄悄潜入队尾”)
q.popleft() # dequeue:弟子施毒后撤退(popleft()如“轻功跃出队列”)
Python哲学:
deque在头部和尾部操作均为O(1),宛如“逍遥派弟子来去如风”。- 对比Java的
ArrayDeque:两者皆为双端队列,但Python的语法更简洁(如“一阳指”VS“六脉神剑”)。
【第二式·循环队列·轻功水上漂的奥秘】
(背景:某日我目睹唐门师姐用暗器在池塘上连点,恍然大悟循环队列的奥义……)
痛点:
普通队列如“直线排队”,队尾到头后空间浪费,需“全体后撤一步”——这显然不够高效。
循环队列解法:
用固定大小数组模拟环形,如“唐门轻功水上漂”,头尾相连:
// Java循环队列示例(手写版)
class CircularQueue {
private String[] data;
private int head = 0, tail = 0, size = 0;
public CircularQueue(int capacity) {
data = new String[capacity];
}
public boolean enqueue(String item) {
if (isFull()) return false;
data[tail] = item;
tail = (tail + 1) % data.length; // 关键:取模实现循环(如“暗器落点绕圈”)
size++;
return true;
}
public String dequeue() {
if (isEmpty()) return null;
String item = data[head];
head = (head + 1) % data.length; // 头指针后移(如“暗器起点绕圈”)
size--;
return item;
}
}
江湖比喻:
head指针如“暗器起点”,tail指针如“暗器落点”。- 取模运算
%如“轻功踏水不沉”,让指针绕圈奔跑(如“唐门师姐踩着荷叶跳圆圈舞”)。
才疏学浅
感谢阅读❤

780

被折叠的 条评论
为什么被折叠?



