首先前2个操作,普通的栈都是ok的。
对于后一个操作,我们可以考虑2种做法:
1.在建立这个栈的同时我们维护一个二叉堆。每次操作是O(logn)的
2.再搞一个栈专门维护每个时刻的最小值。每次操作是O(1)的
代码写了第二种。
#include <bits/stdc++.h>
using namespace std;
/*
用优先队列:查找是O(logn)的
再开一个栈:O(1) 保存历史记录
*/
int n;
stack<int> s;
stack<int> b;
int minv=0x3f3f3f3f;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int k,x;
scanf("%d",&k);
if(k==1)
{
scanf("%d",&x);
s.push(x);
minv=min(minv,x);
b.push(minv);
}
else if(k==2)//pop
{
s.pop();
b.pop();
}
else//getmin
{
printf("%d\n",b.top());
}
}
return 0;
}
/*
7
1 5
1 4
1 3
2
3
1 2
3
*/