题解 | 用两个栈实现队列(帮助各位找和我一样的bug)
用两个栈实现队列
https://www.nowcoder.com/practice/54275ddae22f475981afa2244dd448c6
import java.util.*;
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(stack2.size()==0)
while(stack1.size()!=0 ){
stack2.push(stack1.pop());
}
return stack2.pop();
}
}
还是复制一遍剑指offer的书上的做法,我也是看了之后做的。写题解是为了以后复习,下次写的时候别犯同样错误。
做法:删除一个元素的步骤:当stack2不为空时,在stack2中的栈顶元素是最先进入队列的元素,可以弹出。当stack2为空时,我们把stack1中的元素逐个弹出并压入stack2。由于先进入队列的元素被压到stack1的底端,经过弹出和压入操作之后就处于stack2的顶端,又可以直接弹出。
接下来再插入一个元素d。我们还是把它压入stack1,如图2.9(d)所示,这样会不会有问题呢?我们考虑下一次删除队列的头部stack2不为空,直接弹出它的栈顶元素c,如图2.9(e)所示。而c的确比d先进入队列,应该在d之前从队列中删除,因此不会出现任何矛盾。
我的错误(bug):
import java.util.*;
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(stack2.size()==0)
//、、、、、、(这一句漏了,其实也就是没理解清楚,每次要完整的把1的放到2,2才是按顺序的,如果2有东西,此时由插入1的东西,是错的。破坏了2的顺序。每次放之前,要保证2空了,用完了)
while(stack1.size()!=0 ){
stack2.push(stack1.pop());
}
return stack2.pop();
}
}