使用两个栈来实现队列
一:题目描述
使用两个栈来完成一个队列,实现队列的push操作与pop操作
二:题目解析
1):栈的特性
栈是先进后出,对数据的操作只在一端栈顶进行。
2):队列的特性
队列是先进先出,可以认为数据是从一端进,从另一端出。
题目要求就是使用两个先进后出的栈来实现,先进先出的队列
三:思路分析
-
定义两个静态栈变量,一个为in,用来压入数据,另一个为out,用来弹出数据
-
先将out中的数据弹出并压入到in中。
注意:out中的数据已经是倒叙的!!如输入1,2,3,4;在out中为4,3,2,1!
为什么要这样呢?下面有解释!!! -
然后将待压入的数据压入到in栈中
-
最后将in栈中的数据全部pop出,并push进out栈中。
-
如果想要弹出数据,直接冲out栈中弹出数据就可以了。
为什么要有第二个步骤呢?
我们来看如果没有第二个步骤会是怎么样:
如果现在我想要将1,2,3,4压入我们用栈实现的队列中,那么数据直接进入in栈中
如图:
在将in中的数据弹出,并压入到out中
这时可以将数据从out栈中pop出去,可以实现队列先进先出的要求,但是,这时如果我想要在次将数据压入栈中,这时in栈中为空,反转后就到了out栈中的数据1的上面,就不再满足队列先进先出的特性了!
四:代码
import java.util.Stack;
/*
使用两个栈来实现队列,完成队列的push和pop两个操作
队列特性:
数据先进先出。
栈特性:
数据先进后出
*/
public class Demo09 {
public static void main(String[] args) {
push(1);
push(2);
push(3);
push(4);
Integer pop = pop();
Integer pop1 = pop();
Integer pop2 = pop();
System.out.println(pop);
System.out.println(pop1);
System.out.println(pop2);
}
static Stack<Integer> in = new Stack();
static Stack<Integer> out = new Stack();
//入栈
public static void push(Integer num){
//先将out栈中的数据,全部弹出放入到in栈中
if (!out.isEmpty()){
while (!out.isEmpty()){
in.push(out.pop());
}
}
//压入数据
in.push(num);
//将in这个栈中的所有数据全部出栈并放入到out栈中
while (!in.isEmpty()){
out.push(in.pop());
}
}
//出栈
public static Integer pop(){
//从out栈中出栈
Integer pop = out.pop();
return pop;
}
}