题目描述
实现一个特殊功能的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
示例1
输入
[[1,3],[1,2],[1,1],[3],[2],[3]]
返回值
[1,2]
备注:
有三种操作种类,op1表示push,op2表示pop,op3表示getMin。你需要返回和op3出现次数一样多的数组,表示每次getMin的答案
1<=操作总数<=1000000
-1000000<=每个操作数<=1000000
数据保证没有不合法的操作
import java.util.*;
public class Solution {
Stack<Integer> stack1 = new Stack();
Stack<Integer> minStack = new Stack();
/**
* [[1,3],[1,2],[1,1],[3],[2],[3]]
* 有三种操作种类,op1表示push,op2表示pop,op3表示getMin。你需要返回和op3出现次数一样多的数组,表示每次getMin的答案
* 麻蛋 [1]代表push [2]代表pop [3]表示getMin操作 [1,3]中1代表先push 2代表要push的值
* [1,2]代表push然后pop
*/
/**
* 思路:建立两个栈,一个data栈压入数据(和正常的压栈一样),
* 另一个min栈压入最小值。如果压入的数据比当前最小值小则压入min栈,
* 大于当前最小值则重复压入当前min栈栈顶元素。 min栈和data保持同步的入栈出栈操作,
* 这样始终保持min栈栈顶元素为最小值。
*/
public int[] getMinStack (int[][] op) {
List<Integer> list = new ArrayList();
for(int[] opt : op){
//代表PUSH
if(opt[0] == 1){
push(opt[1]);
}else if(opt[0] == 2){//代表pop
pop();
}else{//代表getMin
list.add(getMin());
}
}
int[] result = new int[list.size()];
for(int i=0;i<list.size();i++){
result[i] = list.get(i);
}
return result;
}
public void push(int val){
if(minStack.isEmpty()){
minStack.push(val);
}else if(val <= getMin()){
minStack.push(val);
}
stack1.push(val);
}
public void pop(){
if(stack1.isEmpty() || minStack.isEmpty()){
return;
}
//peek()不弹出 只返回栈顶元素 注意这里要用equals 因为是Integer 如果用== 将会不相等
if(stack1.peek().equals(minStack.peek()) ){
minStack.pop();
}
stack1.pop();
}
public int getMin(){
return minStack.peek();
}
}