题目:分别用两个栈实现一个队列,和两个队列实现一个栈
分析:
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