题目
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
要求
- pop、push、getMin操作的时间复杂度都是O(1)。
具体实现
//java实现
import java.util.*;
public class java_01{
private Stack<Integer> stackData;//存放入栈的数据
private Stack<Integer> stackMin;//存放栈中的最小值
public java_01() {
// 为栈分配空间
this.stackData=new Stack<Integer>();
this.stackMin=new Stack<Integer>();
}
// 每次都保证stackData栈中最小数在stackMin的栈顶
public void push(int newNum) {
if(this.stackMin.isEmpty()){
this.stackMin.push(newNum);
}else if(newNum <= this.getMin()){
this.stackMin.push(newNum);
}
// 正常入栈stackData
this.stackData.push(newNum);
}
// 出栈
public int pop() {
if(this.stackData.isEmpty() || this.stackMin.isEmpty()){
throw new RuntimeException("Your stack is empty.");
}
int value=this.stackData.pop();
//如果stackData栈中的值像外出栈的是stackData栈中的最小值
// 那么就要更新stackMin栈中的值,使栈顶的数始终是stackData中的最小值
if(value == this.getMin()){
this.stackMin.pop();
}
return value;
}
//获取stackMin栈顶元素
public int getMin(){
if(this.stackMin.isEmpty()){
throw new RuntimeException("Your stack is empty.");
}
return this.stackMin.peek();
}
public static void main(String[] args) {
java_01 stack=new java_01();
stack.push(3);
stack.push(2);
stack.push(1);
stack.push(3);
System.out.println("此时栈中最小值为:"+stack.getMin());
stack.pop();
stack.pop();
stack.pop();
System.out.println("此时栈中最小值为:"+stack.getMin());
}
}