zoukankan      html  css  js  c++  java
  • 第一次使用优先队列

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

     

  • 相关阅读:
    linux C gcc -lm
    ubuntu 工作区中拖动一个窗体到另一个工作区就卡住回不到桌面了
    ArrayList调用remove方法需要注意的地方
    关于Java中File的renameTo函数
    Java管道流
    NPOI Excel 单元格背景颜色对照表
    Java 简单图片截取
    maven pom.xml 配置 cxf-codegen-plugin 生成web服务客户类型
    ZeroClipboard 简单应用
    PromiseJs
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/13271319.html
Copyright © 2011-2022 走看看