双向队列

1、双向队列

描述
    新建的 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

#include <iostream>
#include <set>
#include <stdio.h>
#include <string.h>
#include <deque>
using namespace std;

struct FFF
{
	int k;
	int p;
} ;


deque <FFF> d;

void see()
{
	if(d.empty()) printf("空\n");
	deque<FFF>::iterator it; 
        for(it=d.begin();it!=d.end();it++) 
        {
        	FFF f = *it;
        	printf("                    人 %d 号 %d\n",f.k,f.p);
        	
		}
}

void add()
{
	FFF ff;
	int kk,pp;
	scanf("%d%d",&kk,&pp);
	ff.k = kk;
	ff.p = pp;
	if(d.empty())
	 {
	 	d.push_back(ff);
	 }
	else
	{
		FFF beg = *d.begin();
		if(beg.p>ff.p)
		{
		//	printf("入头 %d %d\n",beg.p,ff.p);
			d.push_front(ff);
			return;
		}
		beg = d.back();
		if(beg.p<ff.p)
		{
		//	printf("入头 %d %d\n",beg.p,ff.p);
			d.push_back(ff);
			return;
		}
		
		 deque<FFF>:: iterator it;
        for(it=d.begin();it!=d.end();it++) 
        {
        	FFF t = *it;
        //	printf("!%d %d\n",ff.p,t.p);
        	if(ff.p<t.p)
        	{
        //		printf("213\n");
        		d.insert(it,1,ff);
        		return;
			}
			
		}
	}
	 
}


void max()
{
	if(d.empty())
	{
		printf("0\n");
		return;
	}
	
	printf("%d\n",d.back());
	d.pop_back();
	
}
void min()
{
	if(d.empty())
	{
		printf("0\n");
		return;
	}
	
	printf("%d\n",d.front());
	d.pop_front();
	
}




int main()
{
	d.clear();
	int c;
	while(scanf("%d",&c),c)
	{
		switch(c)
		{
			case 0:  ;
			case 1: 
				add();
			//	see();
			 	break;
			case 2:
				max();
			//	see();
				break;
			case 3: 
				min();
			//	see();
				break;
			
		}
	}
	printf("0\n");
	
	return 0 ;
}










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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值