题目

  • 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。

要求

  • pop、push、getMin操作的时间复杂度都是O(1)
  • 设计栈类型可以使用现成的栈结构

分析

不知道有没有一开始想法跟我一样的。用一个数保存最小值就可以了啊?但是实际上不是的,如果这样设计当你最小值出栈的时候怎么办呢?实际上,我们可以用两个栈来实现,一个用于存储栈的值,另外一个用于存储最小值序列。

push函数

如果push时min栈为空,那么这个值肯定是最小值、直接放入空栈即可。如果不为空,但是这个值比当前min栈中栈顶的值小,那么也需要入栈,否则不入min栈。


代码如下:

/*这里是入栈操作*/
    public void push(int num){
        if (stackMin.isEmpty()){
            stackMin.push(num);
        }else if (num <= stackMin.peek()){
            stackMin.push(num);
        }
        stackData.push(num);
    }

pop函数

要想出栈,首先要检查当前栈是否为空,如果为空则直接抛出异常。如果不为空,那么需要去看min栈顶是否与要存储值的栈栈顶相等,如果相等min栈顶则需要出栈。

代码如下:

/*这里是出栈操作*/
    public int pop(){
        if (stackData.isEmpty()){
            throw new RuntimeException("栈空!");
        }
        int value = stackData.pop();
        if (stackMin.peek() == value){
            stackMin.pop();
        }
        return value;
    }

getMin函数

如果min栈空,则抛出异常,否则,返回min栈顶元素。

代码如下:

/*这里是返回最小值函数*/
    public int getMin(){
        if (stackMin.isEmpty()){
            throw new RuntimeException("栈空,无最小值");
        }
        return stackMin.peek();
    }

完整代码如下:

package stack_queue;
import java.util.Stack;

public class GetMinStack {
    private Stack<Integer> stackData;
    private Stack<Integer> stackMin;
    public GetMinStack(){
        stackData = new Stack<>();
        stackMin = new Stack<>();
    }
    /*这里是入栈操作*/
    public void push(int num){
        if (stackMin.isEmpty()){
            stackMin.push(num);
        }else if (num <= stackMin.peek()){
            stackMin.push(num);
        }
        stackData.push(num);
    }
    /*这里是出栈操作*/
    public int pop(){
        if (stackData.isEmpty()){
            throw new RuntimeException("栈空!");
        }
        int value = stackData.pop();
        if (stackMin.peek() == value){
            stackMin.pop();
        }
        return value;
    }
    /*这里是返回最小值函数*/
    public int getMin(){
        if (stackMin.isEmpty()){
            throw new RuntimeException("栈空,无最小值");
        }
        return stackMin.peek();
    }
}