/**
* 1.定义一个栈 里面存的是int类型值,
* 2.定义一个压栈方法 push
* public void push(int num) //参数num是入栈的值
* 3.定义一个出栈方法 pop
* public int pop() //返回值是出栈的值
* 4.定义一个获取当时栈中的最小值的方法
* public int getMin() // 返回的是栈中的最小值
*/
public class StackDemo {
//定义原栈
private ArrayList<Integer> data = new ArrayList<Integer>();
//定义辅助栈,存放原栈中最小值的索引
private ArrayList<Integer> mins = new ArrayList<Integer>();
//定义入栈方法,参数是入栈的值
public void push(int num) throws Exception {
//入栈一个数
data.add(num);
//如果辅助栈为空,那么存的就是索引0
if (mins.size()==0){
mins.add(0);
}else{ //如果不为空
//首先获取栈中的最小值
int min = getMin();
//只有入栈的元素比最小值小的时候,则辅助栈添加索引
//这个索引就是data集合的最后一个索引
if (num<min){
mins.add(data.size()-1);
}
}
}
//定义一个出栈方法 返回的是栈顶的值
public int pop() throws Exception {
//如果栈中没有元素了,继续出栈就会抛出异常
if (data.size()==0){
throw new Exception("栈为空");
}else{
//如果出栈的索引值就是辅助栈的栈顶 也就是说
//出栈的就是那个第一次出现的最小值
int minIndex = mins.get(mins.size()-1); //获取mins栈顶值
if (data.size()-1==minIndex){
//辅助栈移除栈顶索引
mins.remove(mins.size()-1);
//返回栈顶值
}
return data.get(data.size()-1);
}
}
//定义一个获取栈中最小值的方法
public int getMin() throws Exception {
//如果辅助栈为空,表示抛出异常
if (mins.size()==0){
throw new Exception("栈为空");
}else{ //如果栈不为空
//最小值索引就是辅助栈的栈顶
int minIndex = mins.get(mins.size()-1);
return data.get(minIndex);
}
}
}