实现一个最小栈,有三种操作,min:得到栈中的最小值,push:在栈顶插入一个元素,pop:弹出栈顶元素,使这三种操作的时间复杂度都是O(1)
要求:语言不限
第一行是一个数Q,接下来Q行每行表示一个操作,每行首先是操作op
若op==0,则输出当前栈中的最小值;
若op==1,表示push,接着正整数x,把在x放进栈顶;
若op==2,表示pop,弹出栈顶元素
保证Q<=500000,保证op==0或2时(即min操作和pop操作时)栈不为空。
你可以假设一开始栈的空的。
对应每个op==0或2,如果是op==0输出当前栈中的最小值,如果是op==2输出弹出的元素。
7 1 3 1 4 0 1 2 0 2 0
3 2 2 3
第一个操作为push 3,此时栈元素为3
第二个操作为push 4,此时栈元素为3,4
第三个操作为min,此时栈元素为3,4,输出最小值3
第四个操作为push 2,此时栈元素为3,4,2
第五个操作为min,此时栈元素为3,4,2,输出最小值2
第六个操作为pop,弹出元素2,此时栈元素为3,4,输出弹出的元素2
第七个操作为min,此时栈元素为3,4,输出最小值3
import java.util.Scanner;
import java.util.Stack;
class MinStack{
// 最小栈,存入栈中的元素的一个数组,长度为2,一个是入栈的元素,另一个是之前入栈内的最小元素
//数组栈, [当前值, 当前最小值]
private Stack<int[]> stack = new Stack<>();
// 构造方法
public MinStack(){};
// push方法
public void push(int val){
if(stack.isEmpty()){
stack.push(new int[]{val, val});
}else{
stack.push(new int[]{val, Math.min(val, stack.peek()[1])});
}
}
// pop方法
public int pop(){
return stack.pop()[0];
}
// getMin方法
public int getMin(){
return stack.peek()[1];
}
}
// https://www.nowcoder.com/practice/a4d17eb2e9884359839f8ec559043761
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int Q, op;
Q = in.nextInt();
MinStack minStack = new MinStack();
for(int i = 0; i < Q; i++){
op = in.nextInt();
if(op == 0){
System.out.println(minStack.getMin());
}else if(op == 1){
minStack.push(in.nextInt());
}else if(op == 2){
System.out.println(minStack.pop());
}
}
}
} /*40%,在哪里会数组越界,求解答*/
import java.util.*;
class minStack{
public Stack<Integer> stack = new Stack<Integer>();
public Stack<Integer> min = new Stack<Integer>();
public int minval = 0;
public int pop(){
int k = 0;
if(!stack.isEmpty()){
k=stack.pop();
min.pop();
minval = min.peek();
return k;
}
else{
return -1;
}
}
public void push(int val){
if(stack.isEmpty()){
minval = val;
}else{
if(val<minval){
minval = val;
}
}
stack.push(val);
min.push(minval);
}
public int getMin(){
if(!stack.isEmpty()){
return min.peek();
}else{
return -1;
}
}
}
public class Main{
public static void main(String[] args){
minStack mmm = new minStack();
Scanner sc = new Scanner(System.in);
int Q= sc.nextInt();
int k = 0;
int m = 0;
for(int i = 0;i<Q;i++){
sc.nextLine();
k = sc.nextInt();
if(k == 0){
System.out.println(mmm.getMin());
}
if(k == 1){
m = sc.nextInt();
mmm.push(m);
}
if(k == 2){
System.out.println(mmm.pop());
}
}
}
}