跳到主要内容

编写Java代码栈实现Push、pop以及max,要求时间复杂度为O(1)?

参考答案:

为了在O(1)时间复杂度内实现Push、Pop和Max操作,我们可以使用两个栈。一个栈(mainStack)用于正常的push和pop操作,而另一个栈(maxStack)用于存储mainStack中的最大值。

以下是Java代码实现:

import java.util.Stack;

public class MaxStack {
    private Stack<Integer> mainStack;
    private Stack<Integer> maxStack;

    public MaxStack() {
        mainStack = new Stack<>();
        maxStack = new Stack<>();
    }

    // Push operation
    public void push(int x) {
        mainStack.push(x);
        if (maxStack.isEmpty() || x >= maxStack.peek()) {
            maxStack.push(x);
        }
    }

    // Pop operation
    public int pop() {
        if (mainStack.isEmpty()) {
            throw new RuntimeException("Stack is empty");
        }
        if (mainStack.peek().equals(maxStack.peek())) {
            maxStack.pop();
        }
        return mainStack.pop();
    }

    // Max operation
    public int max() {
        if (maxStack.isEmpty()) {
            throw new RuntimeException("Stack is empty");
        }
        return maxStack.peek();
    }
}

这个实现中,当一个新的元素被push到mainStack时,我们检查它是否大于或等于maxStack的顶部元素。如果是,我们也将它push到maxStack。这确保了maxStack的顶部元素始终是mainStack中的最大元素。

在pop操作中,我们检查要弹出的元素是否是当前的最大元素(即它是否在maxStack的顶部)。如果是,我们也从maxStack中弹出它。

最后,max操作只是简单地返回maxStack的顶部元素,这就是mainStack中的最大元素。

这个实现保证了Push、Pop和Max操作的时间复杂度都是O(1)。