加载中...

[leetcode]第 1 天 栈与队列(简单)

09 用两个栈实现队列

思路

栈:先进后出
要求:先进先出。在队尾加,从队首删

假设有栈A栈B,添加时压入栈A,删除时将栈A元素出栈,压入栈B,实现倒序,进而实现从队首删

class CQueue {
    Stack<Integer> A;
    Stack<Integer> B;

    public CQueue() {
        A = new Stack<Integer>();    
        B = new Stack<Integer>();    
    }
    
    public void appendTail(int value) {
        A.push(value);
    }
    
    public int deleteHead() {
        if(!B.isEmpty()){
            return B.pop();
        }

        if(A.isEmpty()){
            return -1;
        }

        while(!A.isEmpty()){
            B.push(A.pop());
        }

        return B.pop();
    }
}

30 包含min函数的栈

思路

如何保证min()的时间复杂度也为O(1)?
建立辅助栈

push(x):
将x压入栈A
如果栈B为空或x<栈B的栈顶元素,则x压入栈B

pop():
栈A出栈,将元素标记为y
若y=栈B的栈顶元素,B栈出栈

class MinStack {
    Deque<Integer> A;
    Deque<Integer> B;

    /** initialize your data structure here. */
    public MinStack() {
        A = new LinkedList<>();
        B = new LinkedList<>();
    }
    
    public void push(int x) {
        A.push(x);
        if(B.isEmpty() || B.peek() >= x)
            B.push(x);
    }
    
    public void pop() {
        if(A.pop().equals(B.peek()))
            B.pop();
    }
    
    public int top() {
        return A.peek();
    }
    
    public int min() {
        return B.peek();
    }
}
posted @ 2022-12-19 12:15  Vincy9501  阅读(16)  评论(0编辑  收藏  举报