225.Implement Stack using Queues
用队列实现栈的功能。
MyStack stack = new MyStack();
stack.push(1);
stack.push(2);
stack.top(); // returns 2
stack.pop(); // returns 2
stack.empty(); // returns false
思路:关键在于队列是先进先出,而栈是后进先出,所以他们的顺序是反着的,解决办法就是,每一次push一个数据 x 到队列时,就循环的将队列中位于 x 前面的数拿出来,再放入到 队列尾部去,让 x 处于队列的头部。其余的 top( ) , pop( ) ,empty( ) 就直接利用队列的属性即可。
class MyStack { private: queue<int> q1; public: void push(int x) { q1.push(x); for (int i = 0; i < q1.size() - 1; i++) { q1.push(q1.front()); q1.pop(); } } int pop() { int x = q1.front(); q1.pop(); return x; } int top() { return q1.front(); } bool empty() { return q1.empty(); } };
Java 版:
class MyStack { Queue<Integer> queue1; Queue<Integer> queue2;//运用两个队列 public MyStack() { queue1 = new LinkedList<>(); queue2 = new LinkedList<>();//初始化 } public void push(int x) { if(queue2.size() == 0) queue2.add(x); else{ //使用queue2 一直保存栈顶元素 queue1.add(queue2.remove()); queue2.add(x); } } public int pop() { int res; if(queue2.size() == 1) res = queue2.remove(); else{ //栈顶元素存在于 queue2 中,则直接获取;否则,从 queue1 中获取 while(queue1.size() > 1){ queue2.add(queue1.remove()); } res = queue1.remove(); Queue<Integer> tmp = queue1; queue1 = queue2; //queue1 为空后,交换 queue1 、queue2 的位置 queue2 = tmp; } return res; } public int top() { int res = pop(); push(res); //先 pop 获取栈顶元素,再 push 存入 return res; } public boolean empty() { return queue1.isEmpty() && queue2.isEmpty(); } }