用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
解题思路
首先明白数据结构中两个栈为什么可以实现一个队列的功能,首先栈是什么,我自己的认知里栈是一个先进后出的数据结构
感觉数据结构这个东西你画图就很简单了
然后是队列的数据结构
这个是队的数据结构很好理解就是想排队一样,先进先出,所以基本上使用两个栈基本思路就有了两个栈一进一出就完成了顺序的队的先进先出
解题方法、
首先呢我们自己思考有几种情况,一共是两个栈,有四种情况,
- 第一种,第一个栈为空第二个栈为空,出现情况,刚刚开始入栈或者完成出栈操作
- 第二种,第一个栈无值第二个栈有值,此时开始pop操作,
- 第三种,第一栈有值第二个栈无值,先将第一个栈内容pop出push进第二个栈里面在进行push
- 第四种,第一个栈里面有值,第二个栈里面也有值,要想将第二个栈的内容push,然后再把第一个栈的内容pop,push进第二个栈然后再将原来第二个栈的内容push进第二个栈里面
/**
* 压入队
* @param node 入队的元素
*/
public void push(int node) {
stack1.push(node);
}
上面呢是正常的入队操作就是将我们的值存到第一个栈里面,
/**
* 出队操作
* 两个栈有几种情况
* 1,栈1有值栈2有值(有值的情况下进行入栈操作)
* 2,栈1有值栈2无值(刚开始push或者将所有元素pop之后push)
* 3,栈1无值栈2有值(直接开始pop操作)
* 4,栈1无值栈2无值(无值pop)
* @return 出队的操作
*/
public int pop() {
int stack1Size = stack1.size();
int stack2Size = stack2.size();
if(stack1Size==0 && stack2Size==0){
return 0;
}
if(stack1Size==0 && stack2Size!=0 ){
return (Integer)stack2.pop();
}
if(stack2Size==0){
for (int i = 0; i < stack1Size; i++) {
stack2.push(stack1.pop());
}
return (Integer)stack2.pop();
}
int []arr=new int[stack2Size];
for (int i = 0; i < stack2Size; i++) {
arr[i]=(Integer)stack2.pop();
}
for (int i = 0; i < stack1Size; i++) {
stack2.push(stack1.pop());
}
for (int i = 0; i < arr.length; i++) {
stack2.push(arr[i]);
}
return (Integer)stack2.pop();
}
首先呢先拿到两个栈的大小,然后开始判断如果1是空的2也是空的就不需要做判断,输出0即可,如果1是空的2不是空的则将数据pop即可,如果2是空的。1非空的,都可以将1里面的元素pop,push2
然后就是开始遍历即可,如果2非空1非空,则需要将2内容储存,1内容pop,push进2,然后再将之前的2里面值push到1里面即可
public int pop1() {
if (stack2.size() <= 0) {
while (stack1.size() != 0) {
stack2.push(stack1.pop());
}
}
return (Integer)stack2.pop();
}
当然大神写的可能就是把我们的想法总结了,然后我们来稍微分析一下,只有在第二个栈==0的时候,判断第一个栈是否为0,然后将第一个里面的元素pop到第二个里面,然后最后返回第2的push即可
public int pop2() {
if(stack1.empty()&&stack2.empty()){
throw new RuntimeException("Queue is empty!");
}
if(stack2.empty()){
while(!stack1.empty()){
stack2.push(stack1.pop());
}
}
return (Integer)stack2.pop();
}
写法相同就不在多进行解释了