第一次使用优先队列

问题 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;
}

 



 


 

posted on 2018-01-21 22:23  蔡军帅  阅读(105)  评论(0编辑  收藏  举报