问题 F: 优先队列
时间限制: 1 Sec 内存限制: 128 MB提交: 8 解决: 4
[提交][状态][讨论版]
题目描述
已知进入优先队列的各结点的优先级(为<20的正整数,该值越小,则表示优先级越高),以及各结点入队列和出队列的操作序列,要求输出各结点的出队列顺序(输出编号)。注意,结点的编号为入队列时的序号,且从1开始计起。
输入
输入文件中包含多个测试数据。每个测试数据描述了一个优先队列的操作序列:第一行为一个自然数n,5≤n≤20,表示结点数;接下来有2*n行,描述了这n个结点的入队列和出队列操作序列,如果为push,则表示为入队列,后面有一个正整数表示该结点的优先级,如果为pop,则表示当前优先级最高的结点出队列。输入文件最后一行为0,表示输入结束。
输入数据确保不会出现队列为空时执行pop操作
输出
对输入文件中的每个测试数据,输出n个结点出队列的顺序(输出序号),相邻两个结点之间用符号“->”连接。
样例输入
6
push 17
push 14
push 15
pop
pop
push 5
pop
push 18
push 9
pop
pop
pop
0
样例输出
2->3->4->6->1->5
#include <iostream>
#include <queue>
#include <algorithm>
#include <string>
using namespace std;
struct node//定义了结构体,有x和y两个成员
{
int x, y;//x用来放优先级,y用来放这是第几个数
//下面的函数就是优先队列的元素的比较方法
friend bool operator <(node a, node b)
{
return a.x > b.x;//x成员小的优先级高,就越排在队首
}
};
priority_queue<node>q;//优先队列定义
queue<int>ss;
int main()
{
int n;
node a;
string s1="push", s2="pop",s;
int t;
while (cin >> n && n)
{
while (!q.empty()) q.pop();//别忘了初始化
while (!ss.empty()) ss.pop();
t = 1;
int i;
bool f = 0;
for (i = 1; i <= 2*n; i++)
{
cin >> s;
if (s == s1)
{
cin >> a.x;
a.y = t;//第几个数
t++;
q.push(a);
}
else if (s == s2)
{
a = q.top();
ss.push(a.y);//把要输出的数都放在ss队列里
q.pop();
}
}
while (!ss.empty())
{
if (f == 0)//第一个数前面没有箭头
{
cout << ss.front();
ss.pop();
f = 1;
}
else//从第二项起有箭头
{
cout << "->" << ss.front();
ss.pop();
}
}
cout << endl;
}
return 0;
}