一 设计一个有getMin功能的栈
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
【要求】1.pop、push、getMin操作的时间复杂度都是O(1)。
2.设计的栈类型可以使用现成的栈结构。
public class SpecialStack {private Stack<Integer> dataStack;private Stack<Integer> minStack;public SpecialStack() {dataStack = new Stack<>();minStack = new Stack<>();}public void push(int value) {dataStack.push(value); // 将元素压入数据栈if (minStack.isEmpty() || value <= minStack.peek()) {minStack.push(value); // 如果当前元素小于等于辅助栈栈顶元素,则将当前元素压入辅助栈} else {minStack.push(minStack.peek()); // 如果当前元素大于辅助栈栈顶元素,则将辅助栈的栈顶元素再次压入辅助栈}}public int pop() {if (dataStack.isEmpty()) {throw new RuntimeException("Stack is empty");}minStack.pop(); // 辅助栈同步popreturn dataStack.pop(); // 数据栈pop}public int getMin() {if (minStack.isEmpty()) {throw new RuntimeException("Stack is empty");}return minStack.peek(); // 返回辅助栈的栈顶元素}
}
要实现一个特殊的栈,其中pop、push和getMin操作的时间复杂度都是O(1),我们可以使用两个栈来实现。
具体设计如下:
-
使用一个数据栈来存储栈中的元素。
-
使用一个辅助栈来存储当前数据栈中的最小元素。
在push操作中,将元素压入数据栈时,比较当前元素与辅助栈的栈顶元素,如果小于等于辅助栈的栈顶元素,则将当前元素也压入辅助栈;如果大于辅助栈的栈顶元素,则将辅助栈的栈顶元素再次压入辅助栈。
在pop操作中,同时对数据栈和辅助栈进行pop操作,以确保两个栈中的元素同步。
getMin操作直接返回辅助栈的栈顶元素即可。