题目
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();
*/