题解:

考察点:

易错点:

本题要求三种操作都在复杂度内完成,也就是说都必须在常数时间内完成,其中都是栈本来的操作,很多同学会考虑使用堆来维护最小值,但是这是不对的,因为堆每次找最小值的时间复杂度为

题解:

可以考虑使用两个栈来共同维护,一个栈用来进行元素常规的出栈和入栈操作,另一个栈维护最小值,其中栈顶元素表示当前栈中的最小值。对于入栈操作,首先将入栈,如果中的栈顶元素小,或者为空,则将加入中。对于操作,直接取栈中的栈顶元素。对于出栈操作,栈直接出栈,如果当前栈顶元素等于的栈顶元素,则把的栈顶出栈

#include "bits/stdc++.h"
using namespace std;
stack<int>s;
stack<int>Min;
void Push(int x){
    s.push(x);
    if(Min.empty()) Min.push(x);
    else{
        int tmp=Min.top();
        if(x<=tmp) Min.push(x);
    }
}
int GetMin(){
    return Min.top();
}
int Pop(){
    int tmp=s.top(); s.pop();
    if(tmp==Min.top()&&!Min.empty()) Min.pop();
    return tmp;
}
int main()
{
    //freopen("in.txt","r",stdin);
    int t;
    scanf("%d",&t);
    while(t--){
        int op;
        scanf("%d",&op);
        if(op==0){
            printf("%d\n",GetMin());
        }else if(op==1){
            int x; scanf("%d",&x);
            Push(x);
        }else{
            printf("%d\n",Pop());
        }
    }
    return 0;
}