题目描述:使用两个队列实现栈,完成栈的压入和弹出操作。
问题解决:栈的压入元素时,我们直接将数据插入到queue1中,这样最先插入的数据就在队列queue1的头部,最后插入的元素在队里queue1的尾部。现在我们考虑如何从栈中弹出一个元素,根据栈的特点“后进先出”,最后压入栈的元素应该最先弹出。最后插入的数据在queue1的尾部,而对于队列我们只能从头部删除元素,因此我们可以先出queue1中依次删除元素并插入到queue2中,再从queue1中删除最后插入的数据。
java示例代码如下:
import java.util.*;
/**
@author dyoyo90
@用两个队列实现栈
*/
public class QueuesImplementStack{
private LinkedList<Integer> queue1;
private LinkedList<Integer> queue2;
QueuesImplementStack(){
queue1=new LinkedList<Integer>();
queue2=new LinkedList<Integer>();
}
//pop one element from the stack
public Integer pop(){
Integer 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;
}
//push one element into the stack
public Integer push(Integer e){
if(queue1.size()==0&&queue2.size()==0){
queue1.addLast(e);//here we can also push the element into queue2
}
if(queue1.size()!=0){
queue1.addLast(e);
}
else if(queue2.size()!=0){
queue2.addLast(e);
}
return e;
}
//a test
public static void main(String[] args){
QueuesImplementStack stack=new QueuesImplementStack();
List<Integer> re=new ArrayList<Integer>();
stack.push(1);
stack.push(2);
stack.push(3);
re.add(stack.pop());
stack.push(4);
re.add(stack.pop());
stack.push(5);
re.add(stack.pop());
re.add(stack.pop());
re.add(stack.pop());
Iterator<Integer> it=re.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}