用两个栈实现队列的核心是instack入队、outstack出队:入队o(1);出队和查看队首时,若outstack空则将instack全部转移至outstack再操作,均摊o(1);判空需两栈均空。

用两个栈实现队列,核心思路是:一个栈负责入队(inStack),另一个栈负责出队(outStack)。当需要取元素时,若 outStack 为空,就把 inStack 中所有元素依次弹出并压入 outStack——这样就翻转了顺序,使最早入栈的元素出现在 outStack 栈顶,满足 FIFO 特性。
入队操作(offer / add)
直接把新元素压入 inStack,时间复杂度 O(1)。
- 无需判断或转移,只做一次 push 操作
- 即使 outStack 为空或非空,都不影响入队逻辑
出队操作(poll / remove)
先检查 outStack 是否为空:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 如果不为空,直接 pop outStack 栈顶元素
- 如果为空,把 inStack 所有元素逐个 pop 并 push 到 outStack,再 pop outStack 栈顶
- 这个“搬运”过程只在 outStack 空且需要取元素时发生,均摊时间复杂度仍是 O(1)
查看队首元素(peek / element)
逻辑和 poll 类似,但不删除元素:
- outStack 非空 → 返回其栈顶(不 pop)
- outStack 为空 → 先把 inStack 全部转移到 outStack,再返回 outStack 栈顶
- 注意:peek 不改变栈内容,只是读取;转移后若 inStack 已空,下次 peek 可直接读 outStack
判空(isEmpty)
队列为空当且仅当两个栈都为空:
- return inStack.isEmpty() && outStack.isEmpty();
- 不能只看其中一个栈,因为元素可能分布在两个栈中
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










