队列·数据结构的江湖修行手札4【数据结构学习笔记】

(场景:我蹲在村口王大娘的包子铺前,看着侠客们排成长龙,突然被一道灵光砸中天灵盖……)

江湖观察日记
王大娘的包子摊前,侠客们老老实实排成一列。新来的少林小和尚只能站队尾,而队首的唐门师姐买完包子便轻功离去——这不就是传说中的队列(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() vs add():前者如“小二问:客官能挤一挤吗?”(队列满时返回false),后者如“直接掀桌子抢位!”(队列满时抛异常)。
  • poll() vs remove():前者如“师姐轻功离去”(队列空时返回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的LinkedListpoll()为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指针如“暗器落点”。
  • 取模运算%如“轻功踏水不沉”,让指针绕圈奔跑(如“唐门师姐踩着荷叶跳圆圈舞”)。

才疏学浅

感谢阅读❤

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文艺晓萱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值