/*
* 实现一个特殊的栈,在实现栈的基础功能的基础上,再实现返回栈中最小元素的操作
*
* 1.pop push getMin 操作的时间复杂度都是O(1)
* 2.设计的栈类型可以使用现成的栈结构
*/
public class Code05_GetMinStack {
public static class MyStack1{
private Stack<Integer> stackData;
private Stack<Integer> stackMin;
public MyStack1(){
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);
}
this.stackData.push(newNum);
}
public int pop(){
if(this.stackData.isEmpty()){
throw new RuntimeException("Stack is empty.");
}
int value = this.stackData.pop();
if(value == this.getMin()){
this.stackMin.pop();
}
return value;
}
public int getMin(){
if(this.stackData.isEmpty()){
throw new RuntimeException("Stack is empty.");
}
return this.stackMin.peek();
}
}
public class MyStack2{
private Stack<Integer> stackData;
private Stack<Integer> stackMin;
public MyStack2(){
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("Stack is empty");
}
this.stackMin.pop();
return this.stackData.pop();
}
public int getMin() {
if(this.stackMin.isEmpty()){
throw new RuntimeException("Stack is empty");
}
return this.stackMin.peek();
}
}
/*
*方案一和方案二其实都是用stackMin栈保存着stackData每一步的最小值.共同点是所有操作的时间复杂度都为O(1)、空间复杂度都为O(n)
*
* 区别是:方案一中stackMin压入时稍省空间,但是弹出操作稍费时间;方案二中stackMin压入时稍费空间,但是弹出操作稍省时间.
*
*/
}
设计一个有getMin功能的栈
最新推荐文章于 2021-12-01 10:35:57 发布