最小栈的实现

276 阅读1分钟

实现一个最小栈,具有入栈、出栈、获取最小元素方法,同时要求这三个方法时间复杂度为O(1)

思路:

1. 创建两个栈,栈 A、栈 B (辅助栈)

2. 当第一个元素进入栈 A 时,同时也进入栈 B,这个元素即为当前最小元素

3. 之后每一个元素进入栈 A,同时和 栈B 的栈顶比较大小,如果小于,则同时也入栈B

4. 如果栈 A 出栈,则出栈元素和 栈 B 的栈顶比较,如果相同,则栈 B 的栈顶出栈

5. 栈 B 的栈顶元素即为最小元素

实现代码

    class MinStack {
        mainStack:Array<number>
        auxStack:Array<number>
        constructor() {
            this.mainStack = [];
            this.auxStack = []
        }
        push(element: number) {
            if(!this.auxStack.length || element < this.getMin()) {
                this.auxStack.push(element)
            }
            this.mainStack.push(element)
        }
        getMin():number {
            if(!this.auxStack) {
                throw new Error('stack is empty')
            }
            return this.auxStack[this.auxStack.length -1 ]
        }
        pop(){
            if(!this.mainStack) {
                throw new Error('stack is empty')
            }
            let element = this.mainStack.pop()
            if(element === this.getMin()) {
                this.auxStack.pop()
            }
        }
    }
    
    
    function main() {
        let stack = new MinStack();
        stack.push(4);
        stack.push(9);
        stack.push(7);
        stack.push(3);
        stack.push(8);
        stack.push(5);
        console.log(stack.getMin())
        stack.pop()
        console.log(stack.getMin())
        stack.pop()
        console.log(stack.getMin())
        stack.pop()
        console.log(stack.getMin())
    }
    main()

摘要总结自: 漫画算法 小灰的算法之旅