java实现的用两个栈实现队列
程序员文章站
2022-07-12 09:51:23
...
记得一次面试被问到的一道题, 过后仔细想了一下 , 想出了两个实现方法, 但是思路是一样的
思路 :
- 两个栈 A , B .
- 入时保证A有(当然这时候如果B必须为空, 即使不为空,也要都放到A里)
- 出时保证B有(这个时候A必须为空, 即使不为空,也要都放到B里)
可能觉得 , 没理解 , 其实后面两个来回换的步骤 , 只是因为栈的特性是先入后出 , 但是队列是先入先出的 , 所以, 只能用
一个A栈入队 , 然后在出的时候 , 把这个A栈里的数据弹出来, 依次放到B栈中 , 注意,这个时候,出站的时候直接以B出站 , 为什么呢? 因为A再弹栈然后放入B栈时, 这个时候B栈里的顺序已经改变了, 所以B再弹栈时肯定是对的
举个栗子 : - 有1 , 2 , 3, 4 这四个数 , 如果放到队列中 , 1数字先进 , 出的时候肯定也是 1
- 把数字放入A栈中 , 这是A栈里出栈顺序是 : 4->3->2->1 , 因为栈时先进后出的嘛,
- 这个时候要出栈了 , 再拿一个B栈 , 把A弹栈顺便放到B栈里
- 那么B栈的出栈顺序就是 : 1->2->3->4
如果没懂 , 按照这个顺序画个图 , 一下子就明白了
上代码:
public static void test1(){
for(int i=0; i<5; i++){
inQueue(i);
}
System.out.println(outQueue());
inQueue(5);
System.out.println();
Integer d = null;
do{
d = outQueue();
System.out.println(d);
}while(d!=null);
}
//入队,入队都是入的stack1,保证stack2没有数据
public static void inQueue(int data){
transData(stack2, stack1);
stack1.push(data);
}
//出队,出队都是入的stack2,保证stack1没有数据
public static Integer outQueue(){
transData(stack1, stack2);
int data = 0;
if(!stack2.isEmpty()){
data = stack2.pop();
return data;
}else{
System.out.println("队列为空!");
}
return null;
}
//将a栈数据放入b栈
public static void transData(Stack<Integer> a, Stack<Integer> b){
while(a.size()>0){
b.push(a.pop());
}
}
嫌麻烦比较多? 来个代码少的
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.isEmpty()) {
int temp = stack1.peek();
stack2.push(temp);
stack1.pop();
}
}
int res = stack2.peek();
stack2.pop();
return res;
}
}
其实思路都是一样的 , 至于实现形式 , 看你自己了
如果错误 , 请多多指点.
上一篇: 求斐波那契序列
下一篇: JDK学习之查找算法