队列的特点是先进先出,而栈的特点是先进后出
所以当用两个栈模拟队列的时候,为了依然保持队列的特点,可以将一个栈作为主栈,一个栈作为备用栈
当执行“入队”的时候,可以直接进入主栈;
当执行“出对”的时候,可以先将主栈元素依次push进备用栈直到主栈剩余一个元素(即是要出队的元素)
import java.util.Stack;
public class Solution {
//主栈
Stack<Integer> stack1 = new Stack<Integer>();
//备用栈
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
stack1.push(node);
}
public int pop() {
if(stack1.isEmpty()){
return 0;
}
while(stack1.size() > 1 ){
stack2.push(stack1.pop());
}
int tmp = stack1.pop();
while(!stack2.isEmpty()){
stack1.push(stack2.pop());
}
return tmp;
}
}
但是还是有问题的?问题在于执行“出队”时,都要先腾挪到备用栈,执行完再腾挪回主栈。那么是不是多此一举呢?显然,我们可以发现当腾挪到备用栈之后,备用栈的元素顺序就是出队顺序。
所以需要改进代码:
public class Solution {
//入队栈
Stack<Integer> stack1 = new Stack<Integer>();
//出队栈
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
stack1.push(node);
}
public int pop() {
//出队栈空,需要将入队栈腾挪到出队栈
if(stack2.isEmpty()){
if(stack1.isEmpty()){
return 0;
}
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
}