两个队列实现栈

题目描述:

使用队列实现栈的下列操作:

  • empty() -- 返回栈是否为空
  • push(x) -- 元素 x 入栈
  • pop() -- 移除栈顶元素
  • top() -- 获取栈顶元素

思想:

入栈push():哪个队列为空入哪个,都为空入qu1。最后usedSize++。

出栈pop():若qu2不为空,先出usedSize-1个到qu1,此时qu2只剩一个数据,出队列即可。类似的,若qu1不为空,先出usedSize-1个到qu2,此时qu1只剩一个数据,此数据即为结果。最后usedSize--。

栈顶元素top():若qu2不为空,出队列并使用临时变量tmp保存数据,然后将tmp放入qu1中,如此反复直到qu2为空,此时tmp的值即为栈顶元素。

代码实现:

class MyStack {
    /** Initialize your data structure here. */
    private int usedSize;
    private Queue qu1;
    private Queue qu2;
    public MyStack() {
        this.qu1 = new LinkedList<>();
        this.qu2 = new LinkedList<>();
        this.usedSize = 0;
    }
    
    /** Push element x onto stack. */
    public void push(int x) {
        if(!qu1.isEmpty()){
            qu1.add(x);
        }else if(!qu2.isEmpty()){
            qu2.add(x);
        }else{
            qu1.add(x);
        }
        usedSize++;
    }
    
    /** Removes the element on top of the stack and returns that element. */
    public int pop() {
        int result = 0;
        if(!qu2.isEmpty()){
            for(int i = 0; i< usedSize-1; i++){
                qu1.add(qu2.poll());
            }
            result = qu2.poll();
        }else{
            for(int i = 0; i< usedSize-1; i++){
                qu2.add(qu1.poll());
            }
            result = qu1.poll();
        }
        usedSize--;
        return result;
    }
    
    /** Get the top element. */
    public int top() {
        int tmp = 0;
        if(!qu2.isEmpty()){
            for(int i = 0; i< usedSize; i++){
                tmp = qu2.poll();
                qu1.add(tmp);
            }
        }else{
            for(int i = 0; i< usedSize; i++){
                tmp = qu1.poll();
                qu2.add(tmp);
            }
        }
        return tmp;
    }
    
    /** Returns whether the stack is empty. */
    public boolean empty() {
        return usedSize == 0;
    }
}

解法二:使用一个队列实现栈

代码实现:


class MyStack {
    private Queue qu;
    public MyStack() {
        this.qu = new LinkedList<>();
    }
    
    public void push(int x) {
        qu.add(x);
        int size = qu.size();
        //关键点就在这,队列前面的元素删除后再放入队列,就到了队列后面
        for(int i = 0;i < size-1;i++){
            qu.add(qu.remove());
        }
    }
    
    public int pop() {
        return qu.remove();
    }
    
    public int top() {
        return qu.peek();
    }
    
    public boolean empty() {
        return qu.isEmpty();
    }
}

 

你可能感兴趣的:(剑指offer)