题目
232. 用栈实现队列
分析
先了解一下栈和队列的特点:
- 栈:先进后出
- 队列:先进先出
想用栈实现队列的特点,就需要使用两个栈。因为两个栈就可以将列表倒序。
假设第一个栈 s1 = [1,2,3]
,第二个栈 s2 = []
。若循环执行 s1
元素出栈并且添加到栈 s2
直到栈 s1
为空,则s1 = []
,s2 = [3,2,1]
,即栈s2
元素为栈s1
元素倒序。
最终方法:
- 加入元素的时候,只往栈
s1
里面加入。 - 弹出元素的时候,先弹出栈
s2
里面的元素,如果s2
为空,则把s1
里面的元素放入s2
,然后弹出s2
的元素。 - 判断是否为空,
s1
和s2
同时为空,才为空
代码
class MyQueue {Stack<Integer> s1;Stack<Integer> s2;public MyQueue() {s1 = new Stack<>();s2 = new Stack<>();}public void push(int x) {s1.push(x);}public int pop() {if(!s2.isEmpty()) return s2.pop();if(!s1.isEmpty()) {while(!s1.isEmpty()) {s2.push(s1.pop());}return s2.pop();}return -1;}public int peek() {if(!s2.isEmpty()) return s2.peek();if(!s1.isEmpty()) {while(!s1.isEmpty()) {s2.push(s1.pop());}return s2.peek();}return -1;}public boolean empty() {return s2.isEmpty() && s1.isEmpty();}
}/*** Your MyQueue object will be instantiated and called as such:* MyQueue obj = new MyQueue();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.peek();* boolean param_4 = obj.empty();*/