工作室的小伙伴面试,被问到了两个栈实现一个队列的问题。
主要思想就是借助栈先进后出的特点,再加上两个栈提供的空间优势,将一个栈中的数据压到另一个栈中,此时最先进入的元素,也就是栈A1中栈底(bottom)的元素,变成了栈A2栈顶(top)元素,实现了队列先进先出的特性。
根据这个特性,我想到能不能像武侠小说里那样,好的思想(武功),倒着打也是很厉害的(详情见倚天屠龙记中六大派围攻光明顶,张无忌与少林方丈的一战描述~)
思想都是差不多的,两个队列实现栈的先进后出。
这里直接用JAVA提供的集合LinkedList,用函数AddLast与removefirst来模拟队列先进先出。
代码如下:
package Q07;
/**
* Created by Administrator on 2016/11/7.
*/
import java.util.LinkedList;
public class StackWithTwoQuenes {
//利用两个LinkedList链表模拟队列的先进先出
private LinkedList<String> queue1=new LinkedList<>() ;
private LinkedList<String> queue2=new LinkedList<>() ;
//队列中数据出来
public String pop(){
String re =null;
if(queue1.size()==0&&queue2.size()==0)
{
return null;
}
if(queue2.size()==0){
while(queue1.size()>0){
re=queue1.removeFirst();
if(queue1.size() != 0)
queue2.addLast(re);
}
}
else if(queue1.size()==0){
while(queue2.size()>0){
re=queue2.removeFirst();
if(queue2.size() != 0)
queue1.addLast(re);
}
}
return re;
}
public void push(String a){
if(queue1.size()==0&&queue2.size()==0)
{
queue1.addLast(a);
}
else if(queue1.size()>0&&queue2.size()==0){
queue1.addLast(a);
}
else if(queue2.size()>0&&queue1.size()==0){
queue2.addLast(a);
}
}
public static void main(String [] args){
StackWithTwoQuenes a=new StackWithTwoQuenes();
String b;
a.push("a");
b=a.pop();
System.out.println(b);
a.push("b");
b=a.pop();
System.out.println(b);
a.push("c");
a.push("d");
b=a.pop();
System.out.println(b);
b=a.pop();
System.out.println(b);
b=a.pop();
System.out.println(b);
}
}