Descrição do título
Uma pilha com uma função especial é implementada.Com base nas funções básicas da pilha, a operação de retorno do menor elemento da pilha é realizada.
Exemplo 1
entrar
[[1,3], [1,2], [1,1], [3], [2], [3]]
valor de retorno
[1,2]
Observações:
Existem três tipos de operações, op1 significa push, op2 significa pop e op3 significa getMin. Você precisa retornar uma matriz com tantas ocorrências quanto op3, representando a resposta para getMin a cada vez
1 <= Número total de operações <= 1000000
-1000000 <= Cada operando <= 1000000
Dados garantem que não há operações ilegais
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();
}
}