c++ 数据结构 例题精选 DS队列--银行简单模拟

这个系列是将自己在学校学习中遇到的比较好的例题以及其算法写下来。(对于大神来说肯定不算什么,但是对于编程刚入门的我来说还是有学到新东西的)

DS队列----银行简单模拟

题目描述

设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。

输入

输入为一行正整数,其中第1个数字N(≤1000)为顾客总数,后面跟着N位顾客的编号。编号为奇数的顾客需要到A窗口办理业务,为偶数的顾客则去B窗口。数字间以空格分隔。

输出

按业务处理完成的顺序输出顾客的编号。数字间以空格分隔,但最后一个编号后不能有多余的空格。

样例输入

8 2 1 3 9 4 11 13 15

样例输出

1 3 2 9 11 4 13 15

#include<iostream>

#include<queue>

using namespace std;

int main() {

   
queue<int> q[2];

   
int t,data;

   
cin>>t;

 

   
while(t--){   //数据入队列,奇数进q[0],偶数进q[1]

     
cin>>data;

     
if(data%2)

       
q[0].push(data);

     
else

       
q[1].push(data);

    }

 

   
int i=0;

   
if(q[0].empty())    //输出的第一个数据格式和其他不同,单独处理

       
i=1;

   
cout<<q[i].front();

   
q[i].pop();

 

   
i=1;

   
while(!q[0].empty()|| !q[1].empty()){

     
i++;

     
if(!q[0].empty()){  //每隔一次输出一个数据

        
 cout<<"
"<<q[0].front();

         
q[0].pop();

     
}

     
if(!q[1].empty() && i%2==0){ //每隔两次输出一个数据

         
cout<<" "<<q[1].front();

         
q[1].pop();

     
}

    }

 

   
return 1;

}

答案解析:

首先先将所有数据放进两个队列中

然后第一个或者最后一个输出格式特别,这里选择了在第一个输出做修改。

首先是判断A队列是否有人,如果非空就输出A这里巧妙的使用i作为判断依据,如果非空则修改i的数据。

接下来也就是最妙的地方在于:

因为A窗口处理速度快,B窗口处理速度慢,A处理两个B处理一个,并且同时的话优先输出A(采用在循环中将输出A的语句放在输出B的语句之前)。但是要搞个附带的时间流动的程序又麻烦,于是我们巧妙的使用了i,每次循环过后让i++,并且当i加两次的时候输出B,而A每次都会循环。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值