7-18 银行业务队列简单模拟

问题:
设某银行有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<stdio.h>
#include<stdlib.h>
#define true 1
#define false -1
#define ERROR 0
typedef int ElementType;
typedef struct QNode * Queue;
typedef int Position;
struct QNode{
	ElementType *Data;
	Position Front,Rear;
	int MaxSize;
};
Queue MakeQueue(int MaxSize){
	Queue Q=(Queue)malloc(sizeof(struct QNode));
	Q->Data=(ElementType*)malloc(MaxSize*sizeof(ElementType));
	Q->Front=Q->Rear=0;
	Q->MaxSize=MaxSize;
	return Q;
}
bool IsFull(Queue Q){
	return ((Q->Rear +1)%Q->MaxSize==Q->Front);
}
bool AddQ(Queue Q,ElementType X){
	if(IsFull(Q)){
		printf("队列满");
		return false;
	}
	else{
		Q->Rear =(Q->Rear+1)%Q->MaxSize;
		Q->Data[Q->Rear]=X;
		return true;
	}
}
bool IsEmpty(Queue Q){
	return (Q->Rear ==Q->Front );
}
ElementType Delete(Queue Q){
	if(IsEmpty(Q)){
		printf("队列空");
		return ERROR;
	}
	else{
		Q->Front=(Q->Front +1)%Q->MaxSize;
		return Q->Data[Q->Front]; 
	}
}
void Destory(Queue Q){
	free(Q->Data );
	Q->Data=NULL;
	Q->Front=Q->Rear=0;
}
void Input(Queue A,Queue B){//把元素输进队列
	int i,n,index;//index用来存元素 
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%d",&index);
		if(index%2==0){
			AddQ(B,index);
		}else{
			AddQ(A,index);
		}
	}
	
}
void Deal(Queue A,Queue B){//处理数据并输出 
	int flag=0;
	while(!IsEmpty(A)&&!IsEmpty(B)){
		if(flag==0){
		printf("%d",Delete(A));
		flag=1;
	}else{
		printf(" %d",Delete(A));
	}
	if(!IsEmpty(A)){
		printf(" %d",Delete(A));
	}
	printf(" %d",Delete(B));
}
	while(!IsEmpty(A)){
		if(flag==0){
			printf("%d",Delete(A));
			flag=1;
		}else{
			printf(" %d",Delete(A));
		}
	}
	while(!IsEmpty(B)){
		if(flag==0){
			printf("%d",Delete(B));
			flag=1;
		}else{
			printf(" %d",Delete(B));
		}
	}
}
int main(){
	Queue A=MakeQueue(1000);
	Queue B=MakeQueue(1000);
	Input(A,B);
	Deal(A,B);
	Destory(A);
	Destory(B);
	return 0;
}

如有错误,欢迎指出
谢谢

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这道题目要求我们模拟银行业务队列,具体来说,就是模拟银行柜台的服务过程。我们需要考虑到不同的业务类型,以及不同的客户到达时间和服务时间。我们可以使用队列来模拟客户的排队过程,每个客户进入队列后,按照先来先服务的原则进行服务。当柜台空闲时,队列中的第一个客户就可以进行服务,直到服务完成后,客户离开队列,柜台重新变为空闲状态。 为了实现这个模拟过程,我们需要定义一个客户类,包含客户到达时间、服务时间和业务类型等属性。然后,我们可以使用一个队列来存储客户,每当有客户到达时,就将其加入队列中。同时,我们需要定义一个计时器,来记录当前时间,以便判断客户是否已经到达或者服务已经完成。当柜台空闲时,我们就从队列中取出第一个客户进行服务,直到服务完成后,客户离开队列,柜台重新变为空闲状态。 在模拟过程中,我们需要注意一些细节问题,比如客户到达时间和服务时间的随机性,以及不同业务类型的处理方式等。同时,我们还需要输出一些统计信息,比如客户平均等待时间和柜台利用率等,以便评估银行的服务质量。 ### 回答2: 本题需要模拟银行业务队列的过程,银行业务队列通常包括取款、存款、转账等多种业务,需要对用户的需求进行管理和排序,以确保业务处理的效率。 首先,我们需要定义一个队列,以存储用户在银行中的需求,并对队列中的需求进行操作和排队。我们可以使用数组或链表作为队列的数据结构,具体实现方式可根据实际情况选择。 在模拟银行业务队列时,需要考虑到以下几点: 1. 用户的需求种类及优先级。不同的需求拥有不同的优先级,例如,取款的优先级通常比查询账户余额的优先级高,所以在队列中应该优先处理取款的需求。 2. 队列的推进和弹出操作。在队列中,每当有用户的需求得到满足时,我们需要将队列中的元素向前推进,将下一个需求变为队首元素。同时,需要弹出已经处理完毕的需求,使队列长度减小。这一过程可以通过队列的出队(pop)和入队(push)实现。 3. 用户等待的时间。为了模拟真实的银行业务队列,我们需要记录每个用户在队列中等待的时间,并统计各种需求的平均等待时间。这可以通过记录每个用户的到达时间和完成时间来实现。 在代码实现上,我们可以用一个结构体来表示每个用户的需求和等待时间,然后将它们放入队列中。在每个时间片中,我们需要检查当前队列中的用户需求,并按照优先级处理。同时,还需要更新队列中各个用户的等待时间。当队列为空时,模拟结束,输出各种需求的平均等待时间即可。 总之,模拟银行业务队列需要考虑多个方面的因素,并依据实际需求进行适当的调整和优化。这一过程可以帮助我们更好地理解和掌握队列的概念和应用。 ### 回答3: 本题要求我们使用队列来模拟银行业务的排队与服务过程。具体来说,每个客户会进行某些银行业务(如存款、取款、转账等),我们需要根据客户需求模拟出等待队列、服务队列等环节。 首先,我们需要定义一个队列数据结构来存储等待队列和服务队列中的客户。在考虑队列的实现时,我们可以使用数组或链表来实现。其中,数组实现的队列需要考虑队列的扩容和缩容问题,而链表实现的队列则可以动态扩展和缩减队列长度。由于每个客户需要存储多个属性(如姓名、银行卡号、所需业务等),因此可以定义一个Customer类来描述客户的基本信息和所需服务的银行业务。 其次,我们需要定义一个服务窗口的数量。每个窗口可以同时为一名客户提供服务,因此可以定义一个窗口队列(即服务队列)来存储当前正在执行业务的客户。在客户完成当前业务后,该窗口将被分配给等待队列中的下一位客户。需要注意的是,当等待队列中没有客户时,窗口需要继续等待客户到来。 在模拟过程中,我们需要动态记录客户的到达时间、等待时间、服务开始时间等信息,并根据实际业务流程更新这些信息。具体来说,当客户到达银行时,我们需要将其添加到等待队列中,并记录其到达时间;当客户从等待队列进入服务队列时,我们需要记录其进入服务队列的时间;当客户完成当前业务时,我们需要记录其完成时间和等待时间,并将该客户从服务队列中移除;当服务队列中的窗口空闲时,我们需要从等待队列中选取下一位客户进行服务。 最后,在模拟过程中,我们需要根据特定的顺序来处理等待队列中的客户。一般来说,可以根据客户到达时间的先后顺序来处理队列中的客户,也可以根据客户所需服务的时间长短来进行处理,具体要考虑业务的复杂度和实现难度。另外,需要注意的是,在队列模拟过程中,我们需要根据实际业务需求进行处理,例如禁止客户插队或修改等待队列中客户的顺序,避免模拟结果与实际情况不符。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值