【题目】
实现一个特殊的栈,在实现栈的基本功能的基础上,在实现返回栈中最小元素的操作。
【要求】
1.pop、push、getMin操作的时间复杂度都是O(1)。
2.设计的栈类型可以使用现成的栈结构。
【解答】
使用两个栈,stackData用来保存当前栈的元素,其功能和一个正常的栈没有区别;stackMin用来保存每一步的最小值。
package pers.mao.stackAndQueue.demo_01;
import java.util.Stack;
/**
* @author Mao Qingbo
* @date 2020-09-25
*/
public class MyStack {
private Stack<Integer> stackData;
private Stack<Integer> stackMin;
public MyStack() {
this.stackData = new Stack<Integer>();
this.stackMin = new Stack<Integer>();
}
/**
* 压入规则:
* 如果stackMin为空,将newNum压入stackMin
* 如果stackMin不为空,比较newNum和stackMin的大小:
* 若 newNum<=stackMin.peek(),newNum压入stackMin;
* 若 newNum>stackMin.peek(),stackMin不压入任何内容。
* @param newNum 当前数据
*/
public void push(int newNum){
if(this.stackMin.isEmpty()){
this.stackMin.push(newNum);
}
else if(newNum<=this.stackData.peek()){
this.stackMin.push(newNum);
}
this.stackData.push(newNum);
}
/**
* 弹出规则:
* 若stackData栈顶元素=stackMin栈顶元素,将stackMin栈顶元素弹出;
* 若stackData栈顶元素>stackMin栈顶元素,stackMin不弹出任何内容。
* @return 弹出栈顶元素
*/
public int pop(){
if(this.stackData.isEmpty()){
throw new RuntimeException("Your stack is empty!");
}
int value = this.stackData.pop();
if(value==this.stackMin.peek()){
this.stackMin.pop();
}
return value;
}
/**
* @return 返回stackMin栈顶元素
*/
public int getMin(){
if(this.stackMin.isEmpty()){
throw new RuntimeException("Your stack is empty!");
}
return this.stackMin.peek();
}
}
网友评论