JavaScript用数组实现栈和队列:栈用push/pop实现LIFO,队列用push/shift实现FIFO;为优化性能,高效队列可用双指针模拟,所有操作均为O(1)。

JavaScript 中用数组实现栈和队列非常直接,核心在于控制元素的插入和删除位置——栈是“后进先出”(LIFO),队列是“先进先出”(FIFO)。数组原生方法刚好能高效支持这两种行为,无需额外封装类也能快速上手。
用数组实现栈(LIFO)
栈只允许在一端(通常是末尾)进行压入(push)和弹出(pop),JavaScript 数组的 push() 和 pop() 方法天然匹配这一规则。
-
入栈:用
arr.push(item)添加到末尾 -
出栈:用
arr.pop()移除并返回末尾元素 -
查看栈顶:直接访问
arr[arr.length - 1](不修改数组) -
判空:检查
arr.length === 0
示例:
const stack = []; stack.push(1); // [1] stack.push(2); // [1, 2] console.log(stack.pop()); // 2 console.log(stack[stack.length - 1]); // 1(栈顶)
用数组实现队列(FIFO)
队列需在尾部添加(入队)、头部移除(出队)。数组的 push() 和 shift() 可满足,但注意:shift() 时间复杂度为 O(n),因为要移动所有后续元素;若数据量大,可考虑用双端队列思路优化(见下一条)。
立即学习“Java免费学习笔记(深入)”;
-
入队:用
arr.push(item) -
出队:用
arr.shift() -
查看队首:访问
arr[0] -
判空:同样用
arr.length === 0
示例:
const queue = [];
queue.push('a'); // ['a']
queue.push('b'); // ['a', 'b']
console.log(queue.shift()); // 'a'
console.log(queue[0]); // 'b'更高效的队列实现(避免 shift)
为规避 shift() 的性能问题,可用“双指针+数组”模拟:维护 head(指向队首索引)和 tail(指向下一个入队位置),所有操作均为 O(1)。数组不真正删除元素,仅移动指针;当空间不足时再清理或扩容。
- 入队:
arr[tail++] = item - 出队:先取
arr[head],再head++ - 队首:
arr[head](需确保head ) - 长度:
tail - head;为空时head === tail
这种写法常见于底层实现或高频操作场景,日常小规模使用 push/shift 完全够用。
小结与提醒
数组实现栈和队列简洁实用,适合学习原理和中小型项目。栈推荐无脑用 push/pop;队列若对性能敏感、数据频繁增删,优先考虑指针方式或直接使用 collections/deque 类库(Node.js 环境),浏览器端也可封装一个轻量队列类。记住:逻辑比语法更重要——明确“谁进谁出、从哪进从哪出”,就踩不准坑。
基本上就这些。










