5-2 银行业务队列简单模拟

本文介绍了一个基于队列的模拟程序,该程序模拟了银行两个业务窗口处理顾客请求的过程。通过输入顾客序列及其需要前往的窗口类型,程序能够按业务完成顺序输出顾客编号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

输入格式:

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

输出格式:

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

输入样例:

8 2 1 3 9 4 11 13 15

输出样例:

1 3 2 9 11 4 13 15


#include<stdio.h>
#include<stdlib.h>
#define MaxQsize 1000
#define ERROR -1
typedef struct
{
 int Customer[MaxQsize];
 int rear;
 int front;
}Queue;
Queue *InitialQ()
{
 Queue *PtrQ;
    PtrQ=(Queue*)malloc(sizeof(Queue));
    PtrQ->rear=PtrQ->front=0;
    return PtrQ;
}
/*void InitialQ(Queue *PtrQ)
{
 PtrQ->rear=PtrQ->front=0;
}*/
int IsEmptyQ(Queue*PtrQ)
{
 return PtrQ->front==PtrQ->rear;
}
void AddQ(Queue*PtrQ,int item)
{
 if((PtrQ->rear+1)%MaxQsize==PtrQ->front)
 {
  printf("队列满");
  return;
 }
 PtrQ->rear=(PtrQ->rear+1)%MaxQsize;
 PtrQ->Customer[PtrQ->rear]=item;
}
int DeleteQ(Queue*PtrQ)
{
 if(PtrQ->front==PtrQ->rear)
 {
  printf("队列空");
  return  ERROR;
 }
 else
 {
  PtrQ->front=(PtrQ->front+1)%MaxQsize;
  return PtrQ->Customer[PtrQ->front];
 }
}
int main()
{
 int N,i,cur,flag;
 Queue *A,*B;
 /*初始化两个队列*/
 A=InitialQ();
 B=InitialQ();
 /*根据整数的奇偶性将每个整数插入相应的队列中*/
 scanf("%d",&N);
 for(i=0;i<N;i++)
 {
  scanf(" %d",&cur);
   if(cur%2)
   AddQ(A,cur);
   else
   AddQ(B,cur);
    
  }
  flag=0; /*标记第一个顾客尚未输出*/
 while(!IsEmptyQ(A)&&!IsEmptyQ(B))
 {
  if(!flag)  /*第一个顾客输出后无空格*/这用来实现格式
  {    
     printf("%d",DeleteQ(A));
     flag=1; 
  }
  else
   printf(" %d",DeleteQ(A));
  if(!IsEmptyQ(A))
  printf(" %d",DeleteQ(A));
  printf(" %d",DeleteQ(B));
  }
  while(!IsEmptyQ(A))  /*A队列不空,&B空*/
  {
   if(!flag)  /*第一个顾客输出后无空格*/
  {    
     printf("%d",DeleteQ(A));
     flag=1; 
  }
  else
   printf(" %d",DeleteQ(A));
   }
   while(!IsEmptyQ(B))
   {
    if(!flag)  /*第一个顾客输出后无空格*/
  {    
     printf("%d",DeleteQ(B));
     flag=1; 
  }
  else
   printf(" %d",DeleteQ(B));
    }
    printf("\n");
    return 0;
}



转载于:https://www.cnblogs.com/fllowcool/p/5970915.html

### PTA 7-2 银行业务队列模拟实现解法 此问题的核心在于通过队列模拟银行业务窗口的处理过程。以下是基于题目描述的一个具体解决方案。 #### 数据结构设计 为了高效解决该问题,可以采用两个独立的队列分别表示 A 和 B 窗口等待服务的顾客序列。由于 A 窗口的服务效率是 B 的两倍,在每次循环中需按照比例分配资源并更新状态[^1]。 #### 关键逻辑分析 程序的主要流程包括以下几个方面: 1. 初始化输入数据以及定义用于存储结果的列表。 2. 循环判断当前是否有待处理客户,并依据规则决定哪个窗口先完成业务。 3. 当某个窗口完成一位客户的业务后,立即将其加入到最终的结果序列中;如果存在多个窗口同时结束,则遵循“A优先”的原则输出。 下面提供了一个 Python 版本的具体实现: ```python from collections import deque def bank_service(customers): queue_A, queue_B = deque(), deque() result = [] index = 0 while customers or queue_A or queue_B: # 添加新来的顾客进入对应队列 if customers and (not queue_A or not queue_B): customer = customers.pop(0) if not queue_A: queue_A.append(customer) elif not queue_B: queue_B.append(customer) served_A = False served_B = False # 处理A窗口 if queue_A: queue_A.popleft() served_A = True # 如果A已经服务过一次则尝试B if queue_B and ((served_A and len(queue_A)==0) or not served_A ): queue_B.popleft() served_B = True # 输出已完成客户服务顺序 if served_A: result.append('A') if served_B: result.append('B') return ''.join(result) if __name__ == "__main__": input_customers = list(input().strip())[::-1] output_sequence = bank_service(input_customers) print(output_sequence) ``` 上述代码实现了基本的功能需求,即根据不同的服务能力安排合适的调度策略,并记录下实际被服务完毕的次序。 #### 注意事项 在实际编码过程中需要注意边界条件的处理,比如初始状态下可能只有一个窗口可用等情况下的特殊情形管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值