描述
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
分析
对于栈empty()和isEmpty()效果是一样的,isEmpty()是由stack的父类vector拥有的方法。
建两个栈,一个用来存放数值,一个用来释放数值。
push就直接存放在栈in中
pop()操作,首先判断栈out有没有元素,有直接返回,无则把in中的元素全部压入栈out中,然后释放一个元素。
peek()操作类似于pop操作。
empty():两个栈都是空即说明队列为空。
思路二:栈in只用来辅助改变顺序,而栈out的就表示队列。
每次push操作都把out中的元素全部压入栈In,然后把新元素存入栈in,再全部导入到out中,即顺序满足队列的要求。
pop,peek,操作直接从栈out中弹出元素或访问元素即可。
empty():两个栈都是空即说明队列为空。
class MyQueue {
public Stack<Integer> in;
public Stack<Integer> out;
public MyQueue() {
this.in = new Stack<>();
this.out = new Stack<>();
}
public void push(int x) {
in.push(x);
}
public int pop() {
this.peek();
return out.pop();
}
public int peek() {
if(out.empty()){
while(!in.empty()){
out.push(in.pop());
}
}
return out.peek();
}
public boolean empty() {
return in.empty() && out.empty();
}
}
代码二:
class MyQueue {
public Stack<Integer> in;
public Stack<Integer> out;
public MyQueue() {
this.in = new Stack<>();
this.out = new Stack<>();
}
public void push(int x) {
while(!out.empty()){
in.push(out.pop());
}
in.push(x);
while(!in.empty()){
out.push(in.pop());
}
}
public int pop() {
return out.pop();
}
public int peek() {
return out.peek();
}
public boolean empty() {
return out.empty();
}
}