首页 > 代码库 > 《面试题精选》16.双栈实现队列和双队列实现栈

《面试题精选》16.双栈实现队列和双队列实现栈

题目:分别用两个栈实现一个队列,和两个队列实现一个栈


分析:

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!") ;
    }
}



《面试题精选》16.双栈实现队列和双队列实现栈