包含min函数的栈

 

Posted by     DH on August 14, 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<>();
	// 辅助栈
	Stack<Integer> helpStack  =   new Stack<>();
    
    public void push(int node) {
        
        mainStack.push(node);
        if (helpStack.isEmpty()) {
			helpStack.push(node);
		}else{
			int miniTemp = helpStack.peek();
			if (miniTemp >= node) {
				helpStack.push(node);
			}else{
				helpStack.push(miniTemp);
			}
		}
    }
    
    public void pop() {
        mainStack.pop();
        helpStack.pop();
    }
    
    public int top() {
        return mainStack.peek();
    }
    
    public int min() {
        return helpStack.peek();
    }

}