【PAT甲级】1057 Stack (30 分)【栈】
思路
- 对于pop和push操作,用stack就可以实现
- 对于PeekMedian操作,可以用vector维护栈中所有元素,并且保证递增排序,这样的话vector的中间元素就是中位数
- 当push和pop的时候,vector需要对应的做insert和erase操作,这需要用到lower_bound
- lower_bound( begin,end,num):从begin位置到end-1位置二分查找第一个大于或等于num的数字,返回该数字的迭代器
代码
#include <iostream>
#include <algorithm>
#include <stack>
#include <vector>
using namespace std;
int main()
{
int n;cin >> n;
stack<int> s;
vector<int> v;
while (n--)
{
string op;
cin >> op;
if (op == "Pop")
{
if (s.empty())
puts("Invalid");
else
{
v.erase(lower_bound(v.begin(),v.end(), s.top()));
cout<<s.top()<<endl;
s.pop();
}
}
else if (op == "PeekMedian")
{
if (s.empty())
puts("Invalid");
else
{
if (v.size() % 2 == 0)
cout << v[v.size() / 2 - 1]<<endl;
else
cout << v[(v.size() + 1)/2 - 1]<<endl;
}
}
else if (op == "Push")
{
int x;cin >> x;
s.push(x);
v.insert(lower_bound(v.begin(), v.end(), s.top()), s.top());
}
}
return 0;
}