实验四、队列的实现及应用

本文通过C语言实现队列,模拟银行服务台的排队现象,旨在掌握队列的存储表示、基本操作及其在实际问题中的应用。实验在VC++环境下进行,涉及读取文件中客户到达时间及业务办理时间,计算业务人员空闲时间和客户平均等待时间。

一、实验实习目的及要求

运作结果

1.掌握队列的存储表示和实现。
2.掌握队列的基本操作实现。
3.掌握队列在解决实际问题中的应用。


二、实验实习设备(环境)及要求(软硬件条件)

实验在计算机机房,应用软件VC++;


三、实验实习项目、内容与步骤

利用队列模拟服务台前的排队现象问题。
问题描述:某银行有一个客户办理业务站,在单位时间内随机地有客户到达,设每位客户的业务办理时间是某个范围的随机值。设只有一个窗口,一位业务人员,要求程序模拟统计在设定时间内,业务人员的总空闲时间和客户的平均等待时间。假定模拟数据已按客户到达的先后顺序依次存于某个正文数据文件中,对应每位客户有两个数据:到达时间和需要办理业务的时间,文本文件内容如:10 20 23 10 45 5 55 10 58 15 65 10。


四、实验实习所得结果及分析

运行结果
按照试验步骤,依次是先定义队列结构体,然后再建立main函数,main函数包括队列的建立,初始化,写了一个scanf及打开文件函数函数,用于输入打开文件,读取文件里面内容。我先在D盘里面建了一个a.txt文件,里面存储的是实验报告里面的数据。后面就是按照实验报告依次逐个实现。最后输出结果就是上面截图这样。


五、实验实习结果分析和(或)源程序调试过程

#include<stdio.h>
#include<stdlib.h>
 typedef struct
 {
 	int arrive;//到达时间 
 	int treat;//需要占用的时间 
 }QNODE;

 typedef struct node
 {
 	QNODE data;
 	struct node*next;
 }LNODE;

 LNODE *front,*rear;

 void Jin(QNODE a)//为队列进一个数据做准备
 {
 	LNODE* q = (LNODE*)malloc(sizeof(LNODE));
 	q->data = a;
 	q->next = NULL;
 	if(!front)
 		front = rear = q;
 	else
 		rear = rear->next = q;
 }

 int Chu(QNODE*a)//为队列出一个数据做准备
 {
 	LNODE* q;
 	if(!front)
 		return 0;//队空
	*a = front->data;
	q = front;
	front = front->next;
	if(!front)
		rear = NULL; 
	free(q);
	return 1;
 }
 
 int main(void)
 {
 	char Wenjian[120];	//读取文件的文件名 
 	FILE *fp;
 	QNODE temp, curr;//temp用来储存客服信息	
	//wait21业务员总的空闲时间 clock当前时间 wait2客户总的等待时间 
	//cout客户总数  
 	int have=0,wait21=0,clock=0,wait2=0,count=0,finish; 
 	printf("输入文件名称\n"); //输入文件,需要提前在D盘建好文档,并提前输入好数据
 	scanf("%s",Wenjian);	
 	if((fp=fopen(Wenjian,"r"))==NULL)
 	{
 		printf("文件打开出错");
		 return 0; 
 	}
 	front=rear=NULL;//队列设空
 	have= fscanf(fp,"%d %d",&temp.arrive,&temp.treat);//打开文件,并读入一个客服数据

 	do
	{
 		if(!front&&!(have-2))
 		{
 			wait21+=temp.arrive-clock;//统计业务员等待时间
 			clock = temp.arrive;//时钟推进到暂存变量中的客户的到达时间;
 			Jin(temp);//为队列进一个数据做准备
			have= fscanf(fp,"%d %d",&temp.arrive,&temp.treat); //暂存变量中的客户信息进队;
 		}
 		count++;//客服人数加1
 		Chu(&curr);//为队列出一个数据做准备
 		wait2+=(clock-curr.arrive);//统计客户等待时间
 		finish = clock+curr.treat;//设定当前客户的业务办理结束时间
 		while(!(have-2)&&temp.arrive<=finish)
 		{
 			Jin(temp);//暂存变量中的客户信息进队
 			have= fscanf(fp,"%d %d",&temp.arrive,&temp.treat);//读取下一位客户信息于暂存变量
 		}
 		clock = finish;//时钟推进到当前客户办理结束时间
 	}while(!(have-2)||front);//判断队列是否为空,如果为空,就结束处理数据

 	printf("客户平均等待时间为%f \n业务员等待时间为%d  \n",(double)wait2/count,wait21);
 	printf("模拟总时间为%d \n总等待时间为%d \n客户人数为%d \n",clock,wait2,count);
 	return 0;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pitepa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值