简单模拟单队列排队 C语言


用程序简单模拟一个单队列多窗口的排队模式:
设某银行有一个固定能容纳N个顾客的等候区,顾客想进银行,若等候区有空则可进,否则被拒绝进入。
每当银行柜员叫号时,等候区中最先进入的顾客离开等候区前往柜台办理业务,若叫号时等候区无人,则此次叫号作废。

输入格式:

第一行输入一个不大于20的正整数N,表示银行等候区能容纳的人数,
接下来用若干行表示依时间顺序先后发生的“顾客想进银行”或“叫号”事件,格式分别是:

  • 顾客想进银行,用 In <id> 表示,其中<id>是顾客编号,为不大于100000的正整数;
  • 叫号,用Calling表示。

最后一行是一个#符号,表示输入结束。
注意:

  • 题目输入保证每个顾客的编号是独一无二的,即:不会出现想进银行的顾客与已经在等候区的顾客编号相同的情况。
  • 保证后一个事件一定在前一个事件完成之后才发生,即:不需要考虑事件之间的“同步”问题。

输出格式:

对于输入的每个事件,按同样顺序在一行内输出事件的结果,格式分别是:

  • 顾客想进银行,若顾客进入,则输出 <id> joined. Total:<t> 其中<id>是该顾客的编号,<t>是顾客进入后,等候区的人数
  • 顾客想进银行,若因等候区满而被拒绝,则输出 <id> rejected. 其中<id>是该顾客的编号
  • 叫号,若有顾客前往柜台,则输出 <id> called. Total:<t> 其中<id>是该顾客的编号,<t>是顾客去柜台后,等候区的人数
  • 叫号,等候区无人,则输出 No one!

输入样例:

3
In 101
In 102
In 103
In 104
Calling
In 105
Calling
Calling
Calling
Calling
#	

输出样例:

101 joined. Total:1
102 joined. Total:2
103 joined. Total:3
104 rejected.
101 called. Total:2
105 joined. Total:3
102 called. Total:2
103 called. Total:1
105 called. Total:0
No one!



  这题考察的是基本列队的操作,我用的是的是循环数组的方式操作,比较容易理解,我没在时间内写完所以pta不知道能不能通过,我只通过了样例,要是发现有错误还望指点一下!



代码如下:

#include <stdio.h>
#include<malloc.h>
#include<string.h>
#define MAX 21 

typedef int ElementType;
typedef int Position;

typedef struct QNode *PtrToQNode;
struct QNode{
	int max;
	ElementType id[MAX];
	Position Head;
	Position Rear;
}; 
typedef PtrToQNode Queue;


Queue CreateQueue(int x)
{
	Queue q;
	q=(Queue)malloc(sizeof(struct QNode));
	q->Head = q->Rear = 0;
	q->max = x+1;//这里采用多使用一个空间作为判断队满条件 
	return q;
} 

void InQueue(Queue q,ElementType s)
{
	//下面的if判断队满,前半段是正常情况,后半段是尾在头前面即后面的数组满了在前面插入了数,感觉前半段是多余的 
	if(q->Rear == q->Head - 1 || (q->Rear - q->Head + q->max) % q->max == q->max - 1){ 
	//if((q->Rear + 1) % q->max == q->Head ){//这段也行,上面的太复杂了
		printf("%d rejected.\n",s);
		return;
	}
	q->id[q->Rear] = s; 
	q->Rear = (q->Rear + 1) % q->max;
	printf("%d joined. Total:%d\n",s,(q->Rear - q->Head + q->max) % q->max); 
}

void OutQueue(Queue q)
{
	if(q->Head == q->Rear){//多用一个空间判断空队比较简单 
		printf("No one!\n");
		return;
	}
	int a; 
	a = q->id[q->Head];//保存被call的id
	q->Head = (q->Head + 1) % q->max;//头往前移
	int length;
	length = (q->Rear - q->Head + q->max) % q->max;
	 
	printf("%d called. Total:%d\n",a,length);
}

int main(){
	Queue q;
	ElementType s;
	int x;
	char n[10];
	scanf("%d",&x);
	q = CreateQueue(x);
	/* strcmp(char *a, char *b)相当于判断a!=b,相等返回0,不相等返回1 */ 
	while(strcmp("#",n)){
		scanf("%s",&n);
		if(!strcmp("In",n)){
			scanf("%d",&s);
			InQueue(q,s);	
		}
		if(!strcmp("Calling",n))		
			OutQueue(q);
		if(!strcmp("#",n))
			return 0;
	} 
}
银行排队问题是指在银行有多个窗口提供服务的情况下,顾客按照到达时间在黄线后排队,当有窗口空闲时,下一位顾客选择编号最小的窗口进行处理。根据所提供的输入格式,可以使用C语言解决这个问题。具体的解决方案包括以下步骤: 1. 首先,读取输入数据,包括顾客总人数N、每位顾客的到达时间T和处理时间P,以及窗口数K。 2. 创建一个队列来存储顾客的信息,包括到达时间和处理时间。 3. 创建一个数组来表示每个窗口是否空闲,初始时所有窗口都是空闲的。 4. 创建一个变量来记录当前时间,初始时为第一个顾客的到达时间。 5. 使用一个循环来模拟整个服务过程,直到所有顾客都被处理完毕。 6. 在循环中,首先检查是否有顾客在当前时间到达,如果有,则将其加入队列。 7. 然后检查每个窗口是否空闲,如果有空闲窗口,则从队列中取出一个顾客进行处理,并更新该窗口的状态和完成时间。 8. 每次处理完一个顾客,都需要更新当前时间为下一个到达时间或者下一个顾客被处理完的时间。 9. 循环结束后,计算平均等待时间、最长等待时间和最后完成时间,并输出结果。 以上是解决银行排队问题C语言算法,你可以根据这个算法编写代码实现。如果有其他相关问题,可以提出来。 相关问题: 1. 如何实现队列和数组在C语言中的操作? 2. 如何根据到达时间对顾客进行排序? 3. 如何判断一个窗口是否空闲?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值