用两个栈实现队列的关键是延迟转移:入队只压inStack,出队时outStack为空才批量倒序迁移;容量校验基于两栈元素总和;命名明确职责(如pushStack/popStack)并封装转移逻辑。
用两个栈实现队列,本质是把“后进先出”变成“先进先出”,关键不在堆叠多少逻辑,而在转移时机和状态边界是否清晰。变量处理效率提升,主要来自减少冗余搬运、避免重复校验、以及让每个栈职责纯粹。
入队操作:只往输入栈压,不主动挪动
新元素一律进入输入栈(比如叫 inStack),不做任何转移。这一步必须轻量——不查输出栈状态、不翻看容量余量、不触发数据倒腾。只有当后续出队需要且输出栈为空时,才批量迁移。这样保证每次 push 是 O(1) 时间,变量生命周期短、内存局部性好。
出队前判断:空栈才转移,且一次性搬完
执行 pop 或 peek 时,先检查输出栈(outStack)是否为空:
- 不为空 → 直接取栈顶,无需干预
- 为空 → 把 inStack 所有元素依次弹出、压入 outStack,顺序自然反转
- 搬完后 inStack 必须为空,避免下次误判或重复搬运
容量与空满校验:按真实占用算,不依赖单栈极限
队列总容量不是某个栈的大小,而是两个栈当前元素数之和上限。例如每个栈物理容量为 5,队列最大可存 10 个元素。校验逻辑要写成:
- 入队前:若 inStack.size() + outStack.size() == MAX_CAPACITY → 拒绝
- 出队前:若两者 size 均为 0 → 返回空错误
- 不单独判断某栈是否“满”,因为满≠不能用——只要另一栈有空间,就能通过转移腾位
变量命名与职责隔离:让意图一目了然
避免用 stack1/stack2 这类模糊名。明确命名为 pushStack 和 popStack,并在注释中强调:
- pushStack:只接受 push,绝不主动 pop
- popStack:只响应 pop/peek,除非为空,否则不接收新元素
- 所有跨栈搬运封装成独立函数(如 transferIfEmpty()),调用点干净,调试路径单一

















