包含min函数的栈

Posted by DH on May 3, 2017

题目

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。

分析

栈的特点是先进后出,所以要求min的时间复杂度是1,就必须将最小的元素时刻放在栈顶,那么我们考虑每次压栈的时候,将当前要压栈的元素和栈中所有元素进行 比较,最小的放在栈顶。这样是可以满足min函数的要求,但是这个数据结构就不是栈了,因为不能保证先进后出。

那么我们考虑在栈中设置一个变量保存最小的元素,但是,加入我们将最小的元素出栈,那么第二小的元素是什么呢?就不知道了。

所以考虑,用一个辅助栈去存储最小的元素。 假如我们将3、4、2、1进行入栈操作。

首先,入栈3:

主栈和辅助栈都是空,直接入栈。

入栈4,4不是最小的,所以主栈入栈4,而辅助栈入栈3,始终保持栈顶元素最小,并且两个栈的元素个数相等。

入栈2,主栈直接压栈,辅助栈2是最小的,放在最顶层:

同理可得1入栈的结果如下图所示:

那么我们来看看min函数,在这个函数中,我们调用stack的peek()函数,这个函数的作用是读取栈顶的元素,而不做其他改变。

而进行pop()操作的时候,主栈和辅助栈都必须进行pop操作。

代码

import java.util.Stack;

public class Solution {

    // 创建主栈和辅助栈
    Stack <Integer> mainStack = new Stack<Integer>();
    Stack <Integer> helpStack = new Stack<Integer>();

    public void push(int node) {
        if((mainStack.isEmpty() && helpStack.isEmpty()) || node <= helpStack.peek()){
            helpStack.push(node);
        }else{
            helpStack.push(helpStack.peek());
        }
         mainStack.push(node);
    }

    public void pop() {
        // 出栈的时候,主栈和辅助栈都要出栈
        mainStack.pop();
        helpStack.pop();
    }


    public int top() {
        return mainStack.peek();
    }

    public int min() {
        return helpStack.peek();
    }
}