题目:分别用两个栈实现一个队列,和两个队列实现一个栈
分析:
1> 两个栈实现一个队列:
首先我们还是老方法,举个少量数据的例子,从中发现规律。首先我们向其中一个栈中插入a,b,c。存入栈中的顺序就是c-b-a,此时我们如果进行dequeue操作的话,因为队列是先进先出,所以a是先出的,但如果我们直接对栈pop的话那么出来的就是c。所以我们要将栈1中的数据转移到栈2中,直到最后一个元素时则把它出栈。这样我们就完成了dequeue操作。
但是queue操作怎么办?比如我们要让e,f入队,还是跟前面的一样栈1是用来存数据的。
好吧,我们来理一下思路。栈1是用来存入队的元素,栈2是用来出队的,但出队之前要使得栈1为空。
class MyQueue<T>{
Stack<T> stack1 ,stack2 ;
public MyQueue(){
stack1 = new Stack<T>() ;
stack2 = new Stack<T>() ;
}
public void appendTail(T x){
stack1.push(x) ;
}
public void deleteHead(){
if(stack1.empty()){
if(stack2.empty()) System.out.println("queue is empty!");
else stack2.pop() ;
}else{
while(!stack1.empty()){
stack2.push(stack1.pop()) ;
}
stack2.pop() ;
}
}
public boolean isEmpty(){
if(stack1.empty()&&stack2.empty()) return true ;
else return false ;
}
}2> 两个队列实现一个栈
非空队列用来存数据,空队列用来存储从另一个队列中出队的数据。
如abc存入其中一个队列中,顺序为c-b-a,此时执行出栈操作的话,则将该队列中的元素移到空队列中,知道最后一个元素,则直接出队。当要插入e,f时则直接插入到非空队列中。
class MyStack<T>{
PriorityQueue<T> queue1,queue2 ;
public MyStack(){
queue1 = new PriorityQueue<T>() ;
queue2 = new PriorityQueue<T>() ;
}
public void push(T x){
if(queue1.size()!=0) queue1.add(x) ;
else queue2.add(x) ;
}
public void pop(){
if(queue1.size()!=0){
while(queue1.size()>1) queue2.add(queue1.poll()) ;
queue1.poll() ;
}else if(queue2.size()!=0){
while(queue2.size()>1) queue1.add(queue2.poll()) ;
queue2.poll() ;
}else System.out.println("Stack is empty!") ;
}
}
原文地址:http://blog.csdn.net/speedme/article/details/24304235