代码随想录-2023/07/07

95 阅读1分钟

栈与队列

232.用栈实现队列

解题思路:

  1. 用两个栈模拟一个队列
  2. 一个入栈---当出栈时,将入栈的站内元素全部倒入出栈中,然后出栈,当出栈内为空时,就将入栈再倒一次,若两个栈都为空,则代表该队列为空
class MyQueue {
    Deque<Integer> inputDeque;
    Deque<Integer> outputDeque;
    public MyQueue() {
        inputDeque = new ArrayDeque<>();
        outputDeque = new ArrayDeque<>();
    }
    
    public void push(int x) {
        inputDeque.push(x);
    }
    
    public int pop() {
        if(!outputDeque.isEmpty()){
            return outputDeque.pop();
        }else{
            while(!inputDeque.isEmpty()){
                outputDeque.push(inputDeque.pop());
            }
            return outputDeque.pop();
        }
    }
    
    public int peek() {
        if(!outputDeque.isEmpty()){
            return outputDeque.peek();
        }else{
            while(!inputDeque.isEmpty()){
                outputDeque.push(inputDeque.pop());
            }
            return outputDeque.peek();
        }
        
    }
    
    public boolean empty() {
        return inputDeque.isEmpty() && outputDeque.isEmpty();
    }
}

225.用队列实现栈

用两个队列实现一个先入后出的栈:

  1. 其中一个队列入栈, 当需要出栈时候, 就将一个有元素的队列中的元素转到另外一个空队列中, 然后剩下最后一个用来查看或者弹出, 整个过程永远保证一个队列为空
class MyStack {
    Deque<Integer> inputQueue;
    Deque<Integer> outputQueue;

    public MyStack() {
        inputQueue = new ArrayDeque<>();
        outputQueue = new ArrayDeque<>();
    }   
    
    public void push(int x) {
        if(inputQueue.isEmpty()){
            outputQueue.offerLast(x);
        }else{
            inputQueue.offerLast(x);
        }
    }
    
    public int pop() {
        if(!inputQueue.isEmpty()){
            while(inputQueue.size() > 1){
                outputQueue.offerLast(inputQueue.pollFirst());
            }
            return inputQueue.pollFirst();
        }else{
            while(outputQueue.size() > 1){
                inputQueue.offerLast(outputQueue.pollFirst());
            }
            return outputQueue.pollFirst();
        }
    }
    
    public int top() {
        if(!inputQueue.isEmpty()){
            while(inputQueue.size() > 1){
                outputQueue.offerLast(inputQueue.pollFirst());
            }
            int ans = inputQueue.peekFirst();
            outputQueue.offerLast(inputQueue.pollFirst());
            return ans;
        }else{
            while(outputQueue.size() > 1){
                inputQueue.offerLast(outputQueue.pollFirst());
            }
            int ans = outputQueue.peekFirst();
            inputQueue.offerLast(outputQueue.pollFirst());
            return ans;
        }
    }
    
    public boolean empty() {
        return inputQueue.isEmpty() && outputQueue.isEmpty();
    }
}