【JS 与 Python 实现栈与队列】深入理解它们与浏览器、任务调度的联系!

0 阅读2分钟

🧠 引言

栈(Stack)队列(Queue) 是最基础、最常用的数据结构之一。

但它们不仅仅是面试考点——

  • 浏览器“回退/前进”靠的是栈
  • 微任务 / 宏任务调度用的是队列
  • React Fiber 架构中也用到了优先队列

本篇我们将用 JS 与 Python 双语,手写栈与队列结构,并联系实际场景,彻底搞懂这两个“基础杀器”。


🧱 一、栈(Stack)

✅ 特性

  • 后进先出(LIFO)
  • 插入、删除只在栈顶进行

💻 二、JS 手写栈

class Stack {
  constructor() {
    this.items = [];
  }

  push(val) {
    this.items.push(val);
  }

  pop() {
    return this.items.pop();
  }

  peek() {
    return this.items[this.items.length - 1];
  }

  isEmpty() {
    return this.items.length === 0;
  }
}

// 示例
const s = new Stack();
s.push(1);
s.push(2);
console.log(s.pop()); // 输出 2
console.log(s.peek()); // 输出 1

🐍 Python 手写栈

class Stack:
    def __init__(self):
        self.items = []

    def push(self, val):
        self.items.append(val)

    def pop(self):
        return self.items.pop()

    def peek(self):
        return self.items[-1]

    def is_empty(self):
        return len(self.items) == 0

# 示例
s = Stack()
s.push(1)
s.push(2)
print(s.pop())    # 输出 2
print(s.peek())   # 输出 1

📦 三、栈的真实应用场景

场景应用说明
浏览器回退/前进当前页入栈,点击回退时出栈
函数调用栈JS 执行栈、递归函数调用
括号匹配用栈验证括号是否成对出现
深度优先遍历(DFS)图或树的 DFS 实现

📬 四、队列(Queue)

✅ 特性

  • 先进先出(FIFO)
  • 队尾插入,从队首取出

💻 JS 手写队列

class Queue {
  constructor() {
    this.items = [];
  }

  enqueue(val) {
    this.items.push(val);
  }

  dequeue() {
    return this.items.shift();
  }

  front() {
    return this.items[0];
  }

  isEmpty() {
    return this.items.length === 0;
  }
}

// 示例
const q = new Queue();
q.enqueue(10);
q.enqueue(20);
console.log(q.dequeue()); // 10
console.log(q.front());   // 20

🐍 Python 手写队列

class Queue:
    def __init__(self):
        self.items = []

    def enqueue(self, val):
        self.items.append(val)

    def dequeue(self):
        return self.items.pop(0)

    def front(self):
        return self.items[0]

    def is_empty(self):
        return len(self.items) == 0

# 示例
q = Queue()
q.enqueue(10)
q.enqueue(20)
print(q.dequeue())  # 输出 10
print(q.front())    # 输出 20

📦 五、队列的真实应用场景

场景应用说明
宏任务/微任务调度JS Event Loop 中微任务队列
打印任务队列按顺序打印多个文件
广度优先遍历(BFS)图/树的层序遍历
消息队列 MQ / Kafka分布式系统中用于异步消息投递

⚠️ 六、易错点总结

问题正解
队列用 shift() 性能低?是的,大量操作建议用双端队列结构优化
栈的 peek() 实现忘记判断建议判断是否为空防止 undefined / error
队列空时直接 pop(0) 报错需加 isEmpty() 判断

🧩 七、拓展任务

  • 实现一个双端队列 Deque(支持头尾插入/删除)
  • 实现一个浏览器历史记录系统(入栈+出栈)
  • 用队列实现“节流调度器”(如每秒执行一次任务)

🧠 总结一句话

栈负责“回头看”,队列负责“往前冲”,它们是你数据结构技能树上不可缺的两把武器!


下一篇预告:

📘 第9篇:【递归与迭代大对决】爬楼梯问题 JS+Python 双解,性能全面比较!