双向队列的应用

题目:

描述
新建的 Beijing Institute Group 银行 (BIG-Bank) 在北理工开了一个营业点,他们装备了由 IBM Coral Studio 提供的现代化计算环境,使用现代的信息技术。通常,每个银行客户都有唯一的用来标识身份的正整数 K ,而每当他来到银行寻求服务时,银行都会给他一个正整数 P ,代表他的优先权。银行一个年轻的管理员李凌对软件服务系统的功能十分惊讶。他建议打破银行传统的最低优先权优先的服务方式,加入最高优先权优先的服务。于是,软件系统将得到如下类型的请求:

0 系统终止服务
1 K P 将客户 K 加到等待队列中,并赋优先权 P
2 为有最高优先权的人服务,并将他从等待队列中删除
3 为有最低优先权的人服务,并将他从等待队列中删除
银行的软件工程师张国文现在抽不开身,请你替他写一个程序实现这种服务策略。
输入
输入的每行包含一个可能的请求,只有最后一行是停止请求 ( 代码 0) 。你可以认为每个加入客户的请求 ( 代码 1) 中,赋予的优先权都是不同的。每个标识 K 都是小于 106 的数,优先权 P 都是小于 107 的数,客户可能请求多次服务,每次都会得到不同的优先权。
输出
对每个代码为 2 或 3 的请求,程序必须打印被服务的客户的标识。如果此时队列是空,那么打印 0 。
样例输入
2 
1 20 14 
1 30 3 
2 
1 10 99 
3 
2 
2 
0
样例输出
0 
20 
30 
10 
0


c++ STL 中有双向队列(deque) 因此只要熟悉它里面的一些函数使用,值得注意的是他还可以在中间插入元素,这就使得题目变简单了。


#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <deque>

using namespace std;

//记录每个人的代号与等级
struct Node
{
    int num;
    int level;
};

int main()
{
    deque<Node> q; 
    int n, k, p;
    Node node;
    while(cin >> n)
    {
        if(n == 0)
            return 0;
        if(n == 2)
        {
            if(q.empty())
                cout << 0 << endl;
            else
            {
                cout << q.back().num << endl;
                q.pop_back();
            }
        }
        else if(n == 3)
        {
            if(q.empty())
                cout << 0 << endl;
            else
            {
                cout << q.front().num << endl;
                q.pop_front();
            }
        }
        else
        {
            cin >> k >> p;
            node.num = k;
            node.level = p;
            if(q.empty())
                q.push_back(node);
            else if(p < q.front().level)
            {
                q.push_front(node);
            }
            else if(p > q.back().level)
            {
                q.push_back(node);
            }
            else
            {
                deque<Node> :: iterator it;  //使用迭代器遍历队列
                for(it=q.begin(); it!=q.end(); it++)
                {
                    if(p<it->level) //因为迭代器返回的是指针,所以可以用 -> 访问结构体元素
                    {
                        q.insert(it, 1, node); 
                        break;
                    }
                }
            }
        }
    }

    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值