问题是这样的:
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。要求:1.pop、push、getMin操作的时间复杂度都是O(1)。2.设计的栈类型可以使用现成的栈结构。
这个问题可以用两个栈来实现。一个栈用来存放要push和pop的元素,另一个栈用来返回最小值。具体操作是当push一个数时,先放到栈1中,栈2中如果没有元素就直接放入,有元素就和栈顶元素比较,小于或等于栈顶元素就直接放入,大于时就放入一个等于栈顶元素的值,那么栈顶元素一定是最小元素,而且pop时,左右栈一起pop,之后栈2的栈顶仍然是栈内的最小元素。
代码如下:
public class GetMinStack {
public static void main(String[] args) {
MyStack stack = new MyStack();
stack.push(3);
System.out.println(stack.getmin());
stack.push(4);
System.out.println(stack.getmin());
stack.push(1);
System.out.println(stack.getmin());
System.out.println(stack.pop());
System.out.println(stack.getmin());
}
public static class MyStack {
private Stack<Integer> stackData;
private Stack<Integer> stackMin;
public MyStack() {
this.stackData = new Stack<Integer>();
this.stackMin = new Stack<Integer>();
}
public void push(int newNum) {
if(this.stackMin.isEmpty()) {
this.stackMin.push(newNum);
} else if(newNum < this.getmin()) {
this.stackMin.push(newNum);
} else {
int newMin = this.stackMin.peek();
this.stackMin.push(newMin);
}
this.stackData.push(newNum);
}
public int pop() {
if(this.stackData.isEmpty()) {
throw new RuntimeException("Your stack is empty.");
}
this.stackMin.pop();
return this.stackData.pop();
}
//获取最小值
public int getmin() {
if (this.stackMin.isEmpty()) {
throw new RuntimeException("Your stack is empty.");
}
return this.stackMin.peek();
}
}
}