【剑指Offer】5、用两个栈实现队列

  题目描述:

  用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

  解题思路:

  本题的基本意图是:用两个后入先出的栈来实现先入先出的队列。对于这个问题,我们可以通过一个实例来进行具体分析。不难得出相应的规律:有两个栈stack1和stack2,每次向队列中插入元素可以都压入到stack1中,当需要从队列中删除元素时,我们应该是删除最早插入的那个(FIFO),这时可以将stack1中的元素逐个弹出并压入stack2,直到stack1为空,这时最早插入的元素就位于stack2的栈顶,可以直接弹出。

  因此,我们总结如下:压入元素时,都压入栈1,当需要弹出时,从栈2弹出,当栈2不为空时直接弹出栈顶元素,为空时将栈1的元素“倒进去”。

  举例:

  编程实现(Java):

public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
   
    public void push(int node) {
        stack1.push(node);
    }
    
    public int pop() {
        if(stack2.empty()){  //为空时将栈1的元素“倒进去”
            while(!stack1.empty()){
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
    }
}

  扩展:用两个队列实现一个栈

  用两个队列实现栈相比稍微复杂,当插入一个元素时,可以选择不为空的那个队列直接加进去,而当删除一个元素时,需要借助另一个空队列,首先依次删除原队列的头,并将删除的元素加入另一个队列,直到找到队列最后一个元素,将其删除,这时原来的数据队列变空,另一个队列变为数据栈。

class MyStack {
    Queue<Integer> q1,q2;
    int topValue;

    /** Initialize your data structure here. */
    public MyStack() {
        q1=new LinkedList<>();
        q2=new LinkedList<>();
        topValue=0;
    }
    
    /** Push element x onto stack. */
    public void push(int x) {  //压入到不为空的那个队列中
        if(!q1.isEmpty())  
            q1.add(x);
        else
            q2.add(x);
        
        topValue=x;
    }
    
    /** Removes the element on top of the stack and returns that element. */
    public int pop() {
        
        int temp=0;
        while(!q1.isEmpty()){  //q1不空
            temp=q1.poll();
            if(q1.isEmpty())
                return temp;
            q2.add(temp);
            topValue=temp;
        }
        while(!q2.isEmpty()){  //q1不空
            temp=q2.poll();
            if(!q2.isEmpty()){
                q1.add(temp);
                topValue=temp;
            }
        }
        return temp;
    }
    
    /** Get the top element. */
    public int top() {
        return topValue;
    }
    
    /** Returns whether the stack is empty. */
    public boolean empty() {
        return q1.isEmpty() && q2.isEmpty();
    }
}
posted @ 2019-04-18 16:19  gzshan  阅读(1604)  评论(0编辑  收藏  举报