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

一、实验目的
1.掌握队列的存储表示和实现。
2.掌握队列的基本操作实现。
3.掌握队列在解决实际问题中的应用。
二、实验要求
利用队列模拟服务台前的排队现象问题。
问题描述:某银行有一个客户办理业务站,在单位时间内随机地有客户到达,设每位客户的业务办理时间是某个范围的随机值。设只有一个窗口,一位业务人员,要求程序模拟统计在设定时间内,业务人员的总空闲时间和客户的平均等待时间。假定模拟数据已按客户到达的先后顺序依次存于某个正文数据文件中,对应每位客户有两个数据:到达时间和需要办理业务的时间,文本文件内容如:10 20 23 10 45 5 55 10 58 15 65 10。
三、解题参考思路
与栈相对应,队列是一种先进先出的线性表。它只允许在表的一端进行插入,而在另一端进行删除元素。允许插入的一端称队尾,允许删除的一端称队头。插入与删除分别称为入队与出队。队列示意图如下图所示:

【数据描述】
typedef struct{
int arrive;
int treat;//客户的信息结构
}QNODE;
typedef struct node{
QNODE data;
Struct node *next;//队列中的元素信息
}LNODE,*QueuePtr;

typedef struct{ //链队列类型
QueuePtr front ; //队头指针
QueuePtr rear ; //队尾指针
} LinkQueue;

队列的基本操作如队列的初始化、判空、入队和出队等操作实现参考教材。

【算法描述】
{ 设置统计初值:业务员等待时间,客户总的待时间,客户总人数等
设置当前时钟clock时间为0;//用变量clock来模拟当前时间.
打开数据文件,准备读;
读入第一位客户信息于暂存变量中;//文件读操作have= fscanf(fp,"%d %d",&temp.arrive,&temp.treat);
do{//约定每轮循环,处理完一位客户
if(等待队列为空,并且还有客户)
{ //等待队列为空时
累计业务员总等待时间;
时钟推进到暂存变量中的客户的到达时间;//clock=temp.arrive
暂存变量中的客户信息进队;
读取下一位客户信息于暂存变量;
}
从等待队列出队一位客户;
累计客户人数;
将该客户的等待时间累计到客户的总等待时间;//=当前时间-客户到达时间
设定当前客户的业务办理结束时间;//=当前时间+客户办理业务所需时间
while(下一位客户的到达时间在当前客户处理结束之前,并且还有客户)
{
暂存变量中的客户信息进队;
读取下一位客户信息于暂存变量;
}
时钟推进到当前客户办理结束时间;
}while(还有未处理的客户);//等待队列不为空或者还有客户(have==2)
计算统计结果,并输出;

附:文件操作:
char Fname[120];//读取文件的文件名
FILE*fp;
if((fp=fopen(Fname,“r”))==NULL)
{
printf(“文件打开出错”);
return 0;
}
have= fscanf(fp,"%d %d",&temp.arrive,&temp.treat);//have返回值等于从文件中一次读操作读出数据的个数,这里等于2.

四、实验任务
认真阅读与理解实验内容的具体要求,参考教材相关章节,结合实验内容的要求,编写实验程序并上机调试与测试,完成实验报告的撰写。

需要自己新建 text.txt 文件输入数据

#include <stdio.h>
#include<stdlib.h>
typedef struct{int arrive;int treat;//客户的信息结构
}QNODE;typedef struct node{QNODE data;
struct node *next;//队列中的元素信息
}LNODE,*LNODEPtr;LNODE *front,*rear;// 队头指针和队尾指针//========================================//入队
void EnQueue(QNODE e)
{LNODEPtr s=(LNODEPtr)malloc(sizeof(LNODE));if(!s) // 存储分配失败exit(0);s->data=e;s->next=NULL;rear->next=s;   // 把拥有元素e的新结点s赋值给原队尾结点的后继rear=s;       // 把当前的s设置为队尾结点,rear指向s
}//=========================================//出队
int DeQueue(QNODE *e)
{LNODEPtr p;if(front==rear)return 0;*e=front->next->data; // 将欲删除的队头结点的值赋值给ep=front->next;             // 将欲删除的队头结点暂存给pfront->next=front->next->next;if(rear==p)       // 若队头就是队尾,则删除后将rear指向头结点rear=front;free(p);return 1;
}//==========================================
int main()
{int waitsum1=0,waitsum2=0;//一为业务员等待时间。二为客户等待时间int clock=0;int nubk=0;//用于积累客户人数int have=0;//have用于判断是否有未处理的客户 非0为存在 0为不存在QNODE temp,e;//建造空队列front=rear=(LNODEPtr)malloc(sizeof(LNODE));front->next=NULL;//防止指针乱指FILE *fp=fopen("C:\\test.txt","r");//创建一个TXT文件并打入‘10 20 23 10 45 5 55 10 58 15 65 10’。/*"要打开的文件路径以及文件命名","r" */if(fp==NULL){printf("文件打开失败");return 0;}have= fscanf(fp,"%d %d",&temp.arrive,&temp.treat);do{if( have==2 && front==rear )//等待队列为空并且还有客户{waitsum1+=(temp.arrive-clock);//累计业务员总等待时间clock=temp.arrive;// 时钟推进到暂存变量中的客户的到达时间//入队EnQueue(temp);have= fscanf(fp,"%d %d",&temp.arrive,&temp.treat);}nubk++;//积累客户人数+1//出队DeQueue(&e);waitsum2+=(clock-e.arrive);clock+=e.treat;//时间推进到客户结束时间while(temp.arrive<=clock && have==2) //在上一个客户结束结束之前,若有到达的客户就入队{//入队EnQueue(temp);have= fscanf(fp,"%d %d",&temp.arrive,&temp.treat);}}while(have==2||front!=rear);//还有未处理的客户printf("业务员等待时间为%d\n客户平均等待时间为%f",waitsum1,(float)waitsum2/(float)nubk);return 0;
}

求赞!!!

数据结构实验课:实验四、队列的实现及应用相关推荐

  1. 华中科技大学操作系统实验课 实验四

    一.实验目的 (1)理解设备是文件的概念. (2)掌握Linux模块.驱动的概念和编程流程 (3)Windows /Linux下掌握文件读写基本操作 二.实验内容 (1)编写一个Linux内核模块,并 ...

  2. 微机实验课-实验四扬声器程序设计

    微机实验四操作参考 2018年11月 William 〇.实验准备 本次实验是设计汇编程序,控制8253和8255的工作原理及其应用编程.8253为微机系统中使用的定时/计数器,8255为并行接口,即 ...

  3. 实验课第四次随堂测试

    选择题 请问所有的异常类皆继承哪一个类?A A java.lang.Throwable B java.lang.Exception C java.lang.Error D java.io.Except ...

  4. 《数据挖掘导论》实验课——实验一、数据处理之Numpy

    实验一.数据处理之Numpy 一.实验目的 1. 了解numpy库的基本功能 2. 掌握Numpy库的对数组的操作与运算 二.实验工具: 1. Anaconda 2. Numpy 三.Numpy简介 ...

  5. 如何用matlab画nyqist,机械控制工程基础实验课实验报告

    试验一数学模型的Matlab描述 一.实验目的 ①掌握Malab中数学模型的三种表现形式 ②掌握三种模型之间的转换方法 ③掌握复杂传递函数的求取方法 ④了解复杂系统表现形式及建模方法 二.实验要求 ① ...

  6. 华中科技大学操作系统实验课 实验三

    一.实验目的 (1)理解页面淘汰算法原理,编写程序演示页面淘汰算法. (2)验证Linux虚拟地址转化为物理地址的机制 (3)理解和验证程序运行局部性的原理. (4)理解和验证缺页处理的流程. 二.实 ...

  7. 吉林大学单片机实验课实验五——重量测量

    主要数模转换和点阵液晶屏显示屏,距离上次更新时间有点久,今天把所有的实验全部更新完,实话说啊,这种不加注释的代码,虽然每个命令都是我亲手写的,但是隔了这么久,第一眼看我也是有点懵的,所以从这篇教程开始 ...

  8. 数据结构实验报告—栈和队列

    作者:命运之光 专栏:数据结构 目录 实验内容 实验三 栈和队列 一.需求分析 二.概要设计 三.详细设计 四.调试分析 五.测试结果 附录:源程序代码(带注释) 实验内容 实验三栈和队列 实验环境: ...

  9. sdut 2134 数据结构实验之栈与队列四:括号匹配

    数据结构实验之栈与队列四:括号匹配 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descript ...

最新文章

  1. 【TCP/IP】一张图带你读懂TCP/IP协议
  2. 博科300交换机不中断(non-disruptive)固件升级
  3. hibernate缓存机制详细介绍
  4. 一个好的MIS系统应该考虑哪些内容
  5. 打印菱形(曼哈顿距离法)
  6. 无功功率控制模式matlab,第9章_MATLAB在风力发电技术中的应用仿真.ppt
  7. Python实现控制台清屏
  8. Qt Creator Qt快速最佳实践
  9. 为什么python安装不了numpy库_python 安装与numpy matplotlib 等库安装
  10. Infographic Modern Graphs Mac(现代信息图表动画fcpx插件)
  11. SQL Server批量插入数据
  12. 余承东生日朋友圈深夜连发五个“感恩”:这是一个难忘的日子
  13. HDU-3537 Mock Turtles型翻硬币游戏
  14. CUDA学习(九十七)
  15. java swing弹出输入框_JavaSwing文本框输入中文弹出输入窗口
  16. 关闭恶意无限弹窗的方法
  17. Graphene(石墨烯)区块传播技术能够实现10倍的更高效率
  18. 监控的4个黄金指标(google)
  19. 天线要设计为四分之一波长的原因
  20. 理想国pandas练习题4

热门文章

  1. 【spark】windows spark 环境搭建
  2. #TCGA系列#利用perl提取一个文件夹中的多个文件夹里的注释文本
  3. C#编程:元素法求解定积分/定积分定义求解定积分
  4. Spark sql之集成Hbase-connectors
  5. tsc: command not found 解决方法
  6. win10电脑右键文件夹一直转圈
  7. [附源码]SSM计算机毕业设计基于web的停车收费管理系统JAVA
  8. Spring 中的依赖注入
  9. createrepo -g /enp/comps.xml .
  10. 逆向工程师逆向还原APP和代码,国产化就是这样