#include <cstdio>
#include <set>
#include <cstring>
#include <stack>
using namespace std;
int main()
{
int i, j, k, t, d;
stack<int>s;
char buff[12];
multiset<int>upper; //从小到大排序
multiset<int, greater<int> >lower;//从大到小排序
//我把中位数放在了大的集合里,所以upper里的元素数量比lower的多一个或两个
//如果数量一样就是没有一个数字
scanf("%d",&t);
while(t--)
{
scanf("%s",buff);
if(buff[1] == 'o')
{
if(s.empty())
{
printf("Invalid\n");
}
else
{
d = s.top();
printf("%d\n",d);
s.pop();
if(d >= *upper.begin())
{
upper.erase(upper.find(d));// 放入大的集合
}
else
{
lower.erase(lower.find(d));//放入小的集合
}
if(upper.size() == lower.size() && upper.size() > 0)///保证 upper.size() > 0
{
upper.insert(*lower.begin());
lower.erase(lower.begin());
}
else if(upper.size() - lower.size() > 2)
{
lower.insert(*upper.begin());
upper.erase(upper.begin());
}
}
}
else if(buff[1] == 'u')
{
scanf("%d",&k);
s.push(k);
if(lower.size() && k < *lower.begin())//保证lower.size()>0
{
lower.insert(k);
}
else
{
upper.insert(k);
}
if(upper.size() == lower.size() && upper.size() > 0)
{
upper.insert(*lower.begin());
lower.erase(lower.begin());
}
else if(upper.size() - lower.size() > 2)
{
lower.insert(*upper.begin());
upper.erase(upper.begin());
}
}
else
{
if(upper.size())
printf("%d\n",*upper.begin());
else printf("Invalid\n");
}
}
return 0;
}
PAT 1057 Stack
最新推荐文章于 2023-01-29 15:23:30 发布