编写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)。