题目:
实现一个特殊的栈,在实现栈的基本功能的基础上,在实现返回栈中最小元素的操作
要求:
1.pop、push、getMin 操作的时间复杂度都是O(1)
2.设计的栈类型可以使用现成的栈结构
主要思路:
1. 设计两个栈,stackData和stackMin
2. stackData负责保存当前栈中元素
3. stackMin负责记录每一次压入数据的最小值结果
具体实现:
压入数据
- 假设当前数据为value,将其压入stackData。
- 首先判断stackMin是否为空。如果为空,则value也压入stackMin;如果不为空,则比较value和stackMin的栈顶元素中哪一个更小。
- 如果value更小或两者相等,则value也压入stackMin;如果stackMin 中栈项元素小,则把stackMin的栈顶元素重复压入stackMin,即在栈顶元素上再压入个栈项元素。
弹出数据
- 在stackData中弹出数据,弹出的数据记为minValue。
- 弹出stackMin中的栈顶,返回minValue。
查询当前栈中的最小值
- 返回stackMin的栈顶元素,也就是是当前stackData中的最小值。
import java.util.Stack;
public class StackTest {
public Stack<Integer> stackData;
public Stack<Integer> stackMin;
public StackTest() {
this.stackData=new Stack<Integer>();
this.stackMin=new Stack<Integer>();
}
public void push(int value) {
if(this.stackMin.isEmpty()) {
this.stackMin.push(value);
}
else if(value<this.getMin()) {
this.stackMin.push(value);
}
else {
int minValue=this.stackMin.peek();
this.stackMin.push(minValue);
}
this.stackMin.push(value);
}
public int pop() {
if(this.stackData.isEmpty()) {
throw new RuntimeException(" stack is empty");
}
this.stackMin.pop();
return 0;
}
public int getMin() {
if(this.stackData.isEmpty()) {
throw new RuntimeException(" stack is empty");
}
return this.stackMin.peek();
}
}