栈和队列01-返回栈的最小值

题目介绍

请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.

解题思路

利用两个栈,一个存储完整数据DataStack,一个只存储当前最小值MinStack。
元素入栈时,和MinStack中的栈顶元素比较,如果小或者等于则将该元素分别压入DataStack和MinStack;
若大则只将元素压入DataStack中,直至元素入栈完毕,最小值为MinStack的栈顶元素。

代码实现

//本题中可以直接引用现成的栈结构和方法
class MinStack {
    private Stack DataStack;
    private Stack MinStack;

    public MinStack() {
        this.DataStack = new Stack();
        this.MinStack = new Stack();
    }
	//入栈
    public void push(int newNum){
        if(this.MinStack.isempty()){
            this.MinStack.push(newNum);
        }else if(newNum < MinStack.getMin()){
            this.MinStack.push(newNum);
        }
        this.DataStack.push(newNum);

    }
	//出栈
    public int pop(){
        if(this.DataStack.isempty()){
            throw new runtimeException("the stack is empty");
        }
        int Num = this.DataStack.pop();
        if(Num == this.getMin()){
            this.MinStack.pop();
        }
        return Num;
    }
	//获得最小值
    public int getMin(){
        if(this.MinStack.isempty()){
            throw new runtimeException("the stack is empty");
        }
        return this.MinStack.peek();
    }

}

复杂度

时间复杂度:O(1)
空间复杂度:O(n)

你可能感兴趣的:(栈和队列01-返回栈的最小值)