一、用栈实现队列
本题要求我们使用栈这个数据结构来模拟实现队列的各种操作,我们的具体思路是使用两个栈,将一个栈当作输入栈,用于压入 push传入的数据;另一个栈当作输出栈,用于 pop和 peek 操作。每次 pop 或 peek 时,若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈,这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序,具体代码如下:
/**
* 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();
*/
class MyQueue {
Stack<Integer> in;
Stack<Integer> out;
public MyQueue() {
in = new Stack<>();
out = new Stack<>();
}
public void push(int x) {
in.push(x);
}
public int pop() {
while(!in.empty()){
out.push(in.pop());
}
int a = out.pop();
while(!out.empty()){
in.push(out.pop());
}
return a;
}
public int peek() {
while(!in.empty()){
out.push(in.pop());
}
int a = out.peek();
while(!out.empty()){
in.push(out.pop());
}
return a;
}
public boolean empty() {
return in.empty();
}
}
复杂度分析
- 时间复杂度:O(1)。
- 空间复杂度:O(n)。