概述
在 JavaScript 中,数组不仅是存储数据的容器,更是实现基础数据结构的绝佳工具。利用其内置方法,我们可以轻松构建栈(Stack)和队列(Queue),无需引入额外的类或库。
栈结构:后进先出 (LIFO)
栈的核心逻辑是'后进先出'。想象一摞盘子,最后放上去的总是最先被拿走的那个。在 JS 数组中,这对应着数组的末端操作。
核心方法
- push():向数组末尾添加一个或多个元素,返回新长度。这是入栈操作。
- pop():移除并返回数组最后一个元素。这是出栈操作。
实战示例
const stack = [];
stack.push(1);
stack.push(2);
stack.push(3); // 此时栈顶是 3
console.log(stack.pop()); // 输出 3,栈变为 [1, 2]
这里要注意,pop() 会改变原数组。如果不需要修改原数据,记得先复制一份。
队列结构:先进先出 (FIFO)
队列的逻辑相反,遵循'先进先出',就像排队买票。最早进入的数据最先被处理。
核心方法
- push():依然用于尾部入队。
- shift():移除并返回数组第一个元素。这是出队操作。
实战示例
const queue = [];
queue.push('A');
queue.push('B');
queue.push('C');
console.log(queue.shift()); // 输出 'A',队列变为 ['B', 'C']
虽然 shift() 能完美实现队列逻辑,但它在底层需要移动剩余元素的索引。对于超长队列,频繁调用可能会带来性能损耗,生产环境中有更优的替代方案,但在算法练习或简单场景下完全够用。
反向队列
有时候我们需要一种特殊的结构:从前端添加数据,从后端删除数据。这可以通过组合 unshift() 和 pop() 来实现。
const reverseQueue = [];
reverseQueue.unshift(10);
reverseQueue.();
.(reverseQueue.());

