设计堆栈,以便getminimum,pop,push&顶部全部取O(1)

时间:2014-10-17 09:00:54

标签: stack adt

所以我被问到这个问题:

考虑ADT堆栈。除了Push,Pop之外的操作 和Top,我们想要支持一个新的操作FindMin,它返回最小的 堆栈中的元素。设计数据结构和算法以支持这些 操作使得四个操作(Push,Pop,Top和FindMin)中的每一个都采用 恒定时间。无需检查上下条件,也无需检查 给出Empty和Full的程序。 [提示:使用额外的堆栈。]

所以我看到了一些答案,但是一旦使用了FindMin函数,它们似乎都需要O(n)时间。而且我真的没有得到提示告诉我的内容......请帮助我!!! Thankssss !!

1 个答案:

答案 0 :(得分:0)

import java.util.Stack;

public class StackWithMin extends Stack<Integer> {

private Stack<Integer> minStack;

public StackWithMin () {
    minStack = new Stack<Integer>();    
}

public void push(int value){
    if (value <= min()) { // Note the '=' sign here
        minStack.push(value);
    }

    super.push(value);
}

public Integer pop() {
    int value = super.pop();

    if (value == min()) {
        minStack.pop();         
    }

    return value;
}

public int min() {
    if (minStack.isEmpty()) {
        return Integer.MAX_VALUE;
    } else {
        return minStack.peek();
    }
}

public static void main(String args[]) {
    StackWithMin stackWithMin = new StackWithMin();
    stackWithMin.push(7);
    stackWithMin.push(5);
    stackWithMin.push(6);
    stackWithMin.push(7);
    stackWithMin.push(4);
    System.out.println(stackWithMin.min());
    stackWithMin.pop();
    System.out.println(stackWithMin.min());
}

}