用两个栈实现队列

来源:互联网 发布:linux 粘贴命令 编辑:程序博客网 时间:2024/05/19 18:46
链接:https://www.nowcoder.com/questionTerminal/54275ddae22f475981afa2244dd448c6
来源:牛客网
  • 热度指数:164757  时间限制:1秒 空间限制:32768K
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
分析:栈的特点是先进后出,队列的特点是先进先出。两个栈中一个作为压入栈stack1,只往这个栈压入数据;另一个栈作为弹出栈stack2,在将stack1中的元素都压人stack2后,从stack2中弹出数据。必须要做到以下两点:(参考左程云《程序员代码面试指南 IT名企算法与数据结构题目最优解》一书中思路)
1.若压入栈stack1要往弹出栈stack2压入数据,必须一次性把stack1中的数据全部压入;例如:1~5依次压入stack1,stack1的栈顶到栈底为5~1,从stack1压入stack2时,只将5和4压入了stack2,了stack1还剩下1、2、3没有压入。此时若进行弹出操作,那么4将最先弹出,与预想的队列顺序就不一直。
2.若弹出栈stack2不为空,压入栈stack1不能向stack2中压入数据。例如:1~5依次压入stack1,stack1将所有的数据压入stack2,此时stack2的栈顶到栈底就变成了1~5.此时又有6~10依次压入stack1,stack2不为空,stack1不能向其中压入数据。如果向stack2压入了数据,stack2的栈顶到栈底元素就变成了6~10、1~5,此时若进行弹出操作,那么6将最先弹出,与预想的队列顺序就不一直。


import java.util.Stack;public class Solution {    Stack<Integer> stack1 = new Stack<Integer>();    Stack<Integer> stack2 = new Stack<Integer>();        public void push(int node) {            stack1.push(node);    }        public int pop() {        if(stack1.empty() && stack2.empty())            throw new RuntimeException("Queue is empty !");        else if(stack2.empty()){            while(!stack1.empty())                stack2.push(stack1.pop());        }        return stack2.pop();    }}