一、实验目的

(1)掌握队列的链式存储结构

(2)掌握队列的基本操作,并能进行应用实践

(3)使用C/C++语言和队列实现”银行叫号系统“专题

二、实验任务

设计一个控制台程序,模拟银行排队业务,要求实现功能:

(1)输出程序界面,提示客户输入银行窗口数量和开放窗口时间

(2)客户随机时间进入银行,程序在事件表中记录客户进入时间和离开时间,并将客户排入窗口队列,办理完业务后退出队列

三、实验代码

1.事件链表

1.1 EventList.h

#pragma once
#include "pch.h"
#include "defineConst.h"
typedef struct Event
{int time;//发生时刻int type;//事件类型:0表示顾客到达;1~N表示顾客从N号窗口离开struct Event *next;
}Event,*EventList;
int InitList(EventList &pList);  //初始化链表
int OrderInsert(EventList &pList, Event sEvent);   //按发生时刻的顺序向链表中插入元素
int isEmptyList(EventList pList);
int delFirst(EventList &pList, Event *pEvent);
int ListTravel(EventList pList);

1.2 EventList.cpp

#include "pch.h"
#include "EventList.h"
#include<iostream>
#include<stdio.h>
int InitList(EventList &pList)//初始化链表
{pList = (EventList)malloc(sizeof(Event));//开辟空间pList ->next= NULL;//下一个为空return OK;
}
int OrderInsert(EventList &pList, Event sEvent)//插入元素
{//临时变量,用于在链表中插入结点Event *pafter, *pbefore;pbefore = pList;pafter = pList->next;//比较事件发生的时间while (pafter != NULL && sEvent.time > pafter->time){pbefore = pafter;pafter = pafter->next;}//创建一个新结点挂在Before和After两个结点之间pbefore->next = (Event *)malloc(sizeof(Event));//对新结点赋值pbefore->next->time = sEvent.time;pbefore->next->type = sEvent.type;pbefore->next->next = pafter;return OK;
}int isEmptyList(EventList pList)//判断链表是否为空
{if (pList->next ==NULL)return TRUE;elsereturn FALSE;
}
int delFirst(EventList & pList, Event *pEvent)//删除首结点
{Event *ptmp;if (isEmptyList(pList)){printf("链表为空,无可删除节点");return ERROR;}else{//删除链表首结点ptmp = pList->next;pList->next = ptmp->next;*pEvent = *ptmp;//保存数值free(ptmp);//释放内存return OK;}
}
int ListTravel(EventList pList)//遍历链表
{Event *ptmp;ptmp = pList;while (ptmp->next != NULL){ptmp = ptmp->next;if (ptmp->type == 0)printf("第%d分钟,下一名顾客即将到来。\n", ptmp->time);elseprintf("第%d分钟, %d号窗口顾客即将离开。\n", ptmp->time, ptmp->type);}printf("\n");return OK;
}

2.链式队列

2.1 LinkedQueue.h

#pragma once
#include "pch.h"
#include "defineConst.h"
typedef struct QElemType
{int time;int duration;struct QElemType *next;
}QElemType;
typedef struct LinkedQueue
{QElemType *front;//头指针QElemType *rear;//尾指针
}LinkedQueue;
int InitQueue(LinkedQueue *pQueue);
int isemptyQueue(LinkedQueue *pQueue);
int delFirstQueue(LinkedQueue *pQueue,QElemType *pQElem);
int enQueue(LinkedQueue *pQueue, QElemType sQElem);
int queueLength(LinkedQueue *pQueue);
int getHead(LinkedQueue *pQueue, QElemType * pQElem);
int queueTravel(LinkedQueue *pQueue);

2.2 LinkedQueue.cpp

#include "pch.h"
#include"LinkedQueue.h"
#include<iostream>int InitQueue(LinkedQueue *pQueue)
{//分配内存pQueue->front = pQueue->rear = (QElemType *)malloc(sizeof(QElemType));if (pQueue->front == NULL){printf("分配内存失败!\n");exit(-1);}pQueue->front->next = NULL;return OK;
}
int isemptyQueue(LinkedQueue *pQueue)
{if (pQueue->front == pQueue->rear)return true;elsereturn false;
}
int delFirstQueue(LinkedQueue *pQueue, QElemType *pQElem)
{QElemType *ptmp;//临时结点指针if (isemptyQueue(pQueue)){printf("队列为空,不能继续出队列\n");return ERROR;}else{ptmp = pQueue->front->next; //让ptmp指向队列的首节点的后一个元素*pQElem = *ptmp;    //将首节点的值复制给pQElempQueue->front->next = ptmp->next;//front指针向后移动一位,删除这个结点if (pQueue->rear == ptmp){pQueue->rear = pQueue->front;}free(ptmp);return OK;}
}
int enQueue(LinkedQueue *pQueue, QElemType sQElem)//结点入队操作
{QElemType *ptmp;//临时结点指针ptmp = (QElemType *)malloc(sizeof(QElemType));if (ptmp == NULL){printf("分配内存失败!");exit(-1);}else{//尾节点指向新入队的元素*ptmp=sQElem;ptmp->next = NULL;pQueue->rear->next = ptmp;pQueue->rear = ptmp;}return OK;
}
int queueLength(LinkedQueue *pQueue)//获取队列长度
{QElemType *ptmp;//临时结点指针int count = 0;ptmp = pQueue->front->next;//队列第一个结点while (ptmp != NULL){count++;ptmp = ptmp->next;}return count;
}
int getHead(LinkedQueue *pQueue, QElemType * pQElem)
{if (isemptyQueue(pQueue)){printf("队列为空!");return ERROR;}*pQElem = *(pQueue->front->next);return OK;
}
int queueTravel(LinkedQueue *pQueue)
{QElemType *ptmp;//临时结点指针if (isemptyQueue(pQueue)){printf("队列为空!\n");return ERROR;}ptmp = pQueue->front->next;//队列第一个结点while (ptmp != NULL){printf("[到达时刻:第%d分钟,服务时长:%d分钟]\n",ptmp->time,ptmp->duration);ptmp = ptmp->next;}printf("\n");return OK;
}

3.主要业务功能

3.1 BankService.h

#pragma once
#include "pch.h"
#include "defineConst.h"
#include<stdio.h>
void Initialize();
void CustomerArrived();
void CustomerLeaved();
int ShortestQueue();
void PrintQueue();
void PrintEventList();
void BankSimulation();

3.2 BankService.cpp

#include "pch.h"
#include "EventList.h"
#include "LinkedQueue.h"
#include"BankService.h"
#include<iostream>
#include <time.h>
#include <stdio.h>
#define Maxsize 20//银行服务窗口最大数量
int gWindowNum;//银行服务窗口数
int gCustomerNum;//客户总人数
int gTotalTime;//总服务时间
int gCloseTime;//银行关闭时间
EventList gEventList;//事件列表
Event gEvent;//事件
LinkedQueue gQueue[Maxsize];//队列数组
QElemType gCustomer;//队列结点
void Initialize()//初始化数据
{int i;gTotalTime = 0;gCustomerNum = 0;InitList(gEventList);//初始化事件列表//服务窗口个数printf("请输入银行服务窗口个数(1~20):");scanf_s("%d", &gWindowNum);while (gWindowNum<1 || gWindowNum>Maxsize){printf("请输入1到%d之间的整数:", Maxsize);scanf_s("%d", &gWindowNum);}//服务关闭时间printf("请输入服务关闭时间(超过这个时间就不再接纳新顾客)(单位:分钟):");scanf_s("%d", &gCloseTime);while (gCloseTime < 1){printf("请输入大于零的整数:");scanf_s("%d", &gCloseTime);}//为每一个窗口建立一个空队列for (i = 0;i < gWindowNum;i++){InitQueue(&gQueue[i]);}
}
void CustomerArrived()//处理客户到达事件
{QElemType sQElem;Event sEvent;int index;//排队人数最少的窗口编号int arrivetime;//客户到达时间int duration;//业务办理时间printf("当前时刻:第%d分钟\n", gEvent.time);//顾客到达的时间,在上一位顾客之后1~5分钟arrivetime = gEvent.time+ rand() % 5 + 1;duration = rand() % 21 + 10;//办理业务时间为10~30分钟if (arrivetime < gCloseTime)//服务尚未关闭{gCustomerNum++;//新顾客到达事件sEvent.time = arrivetime;sEvent.type = 0;OrderInsert(gEventList, sEvent);//顾客进入人数最少的窗口排队sQElem.time = gEvent.time;//入队时刻sQElem.duration = duration;//办理业务时间index = ShortestQueue();enQueue(&gQueue[index], sQElem);//入列//如果恰好排在了队首,预定离开事件if (queueLength(&gQueue[index]) == 1){//记录顾客从第index+1号号窗口离开(因为索引从0开始)sEvent.time =gEvent.time + duration;sEvent.type = index + 1;OrderInsert(gEventList, sEvent);}}else//银行排队服务关闭,不再接受新客户printf("\n排队服务以关闭,不再接受新客户!\n");}
void CustomerLeaved()//处理客户离开事件
{Event sEvent;int index = gEvent.type - 1;//队列编号为窗口编号-1delFirstQueue(&gQueue[index], &gCustomer);//删除队首节点printf("\n顾客离开时间:%d", gEvent.time);gTotalTime += gCustomer.duration;//记录服务时间//如果队列不为空,则预定下一位顾客从第index+1窗口离开if (isemptyQueue(&gQueue[index])){getHead(&gQueue[index], &gCustomer);//获得下一位顾客// 记录离开事件sEvent.time = gEvent.time + gCustomer.duration;sEvent.type = index + 1;OrderInsert(gEventList, sEvent);}
}
int ShortestQueue()
{int i = 0;int min = 9999;//最短队列的长度int index = -1;//最短队列的编号int length = 0;//遍历各个窗口,比较哪个窗口排队的人数最少for (int i = 0;i < gWindowNum;i++){length = queueLength(&gQueue[i]);if (min > length){min = length;index=i;}}return index;
}
void PrintQueue()//显示当前窗口队列
{int i;printf("\n窗口排队状态:\n");for (i = 0;i < gWindowNum;i++){printf("%d号窗口:\n",i+1);queueTravel(&gQueue[i]);}printf("\n");
}
void PrintEventList()//显示当前事件表
{printf("\n事件表状态:\n");ListTravel(gEventList);
}
void BankSimulation()//银行排队模拟
{//随机数发生器,用于模拟随机用户排队事件//根据当前系统时间初始化随机数种子srand((unsigned) time(NULL));//准备开业Initialize();//第一个顾客到来gEvent.time = 0;gEvent.type = 0;OrderInsert(gEventList, gEvent);//处理排队列表while (!isEmptyList(gEventList)){delFirst(gEventList, &gEvent);//处理顾客事件if (gEvent.type == 0)CustomerArrived();elseCustomerLeaved();//显示当前事件列表,以及排队情况PrintEventList();PrintQueue();//暂停一会,便于观察输出内容system("PAUSE");}//平均服务时间printf("\n");printf("客服平均服务时间:%f分钟\n", (float)gTotalTime / gCustomerNum);system("PAUSE");
}

4.主函数

#include "pch.h"
#include"defineConst.h"
#include"BankService.h"
#include "EventList.h"
#include"LinkedQueue.h"
#include <iostream>int main()
{BankSimulation();
}

5. 程序结果

数据结构实验二——队列(银行叫号系统)相关推荐

  1. 基于IDEA的JavaWeb银行叫号系统

    文档源资源见: https://pan.baidu.com/s/1Vc35QF-SP5NFq1xQJeX1jQ 提取码: 8259 复制这段内容后打开百度网盘手机App,操作更方便哦 基于JavaWe ...

  2. 数据结构实验二 :二叉树的操作与实现

    数据结构实验一:线性表,堆栈和队列实现 数据结构实验二 :二叉树的操作与实现 数据结构实验三: 图的操作与实现 数据结构实验四 : 查找和排序算法实现 文章目录 一.实验目的: 二.使用仪器.器材 三 ...

  3. sdut 2135 数据结构实验之队列一:排队买饭

    数据结构实验之队列一:排队买饭 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descriptio ...

  4. matlab1信号的单边z变换:,实验二 离散时间信号与系统的Z变换分析

    实验二 离散时间信号与系统的Z变换分析 一. 实验目的 1.熟悉离散信号Z变换的原理及性质 2.熟悉常见信号的Z变换 3.了解正/反Z变换的MATLAB实现方法 4.了解离散信号的Z变换与其对应的理想 ...

  5. 利用MATLAB进行系统时域分析,实验二 利用matlab进行系统的时域分析

    实验二 利用matlab进行系统的时域分析 实验二 利用MATLAB进行系统的时域分析 1.实验目的 在理论学习的基础上,通过本实验熟悉LTI连续时间系统的时域分析方法, 熟悉系统的零输入响应.零状态 ...

  6. 数据结构实验二(C语言):银行排队系统

    银行排队系统 [问题描述]假设银行只有2个窗口对外营业,顾客到银行办理业务,首先要取一个顺序号,然后排队等待叫号.被叫到号的顾客到柜台接受服务,服务完毕后离开.到了下班时间不再接收新来的顾客.顾客分为 ...

  7. 用python写银行叫号系统(这个是学校的实训题目,真的没什么技术含量)

    一. 项目概述 智能排队叫号系统是在银行等待业务办理区域所使用的智能叫号系统,系统可有效解决客户办理业务时排队的无序.业务员工作量的不平衡.就诊环境嘈杂等问题. 二. 需求分析 主要分为取号.排队等待 ...

  8. 数据结构实验二 树和二叉树的实现

    广州大学学生实验报告 开课实验室:计算机科学与工程实验(电子楼418A)     2019年5月13日 学院 计算机科学与教育软件学院 年级.专业.班 计算机科学与技术172班 姓名 学号 17061 ...

  9. 数据结构-实验二  树和二叉树的实现

     广州大学学生实验报告 开课实验室:计算机科学与工程实验(电子楼417)     2018年05月16日 学院 计算机科学与教育软件学院 年级.专业.班 网络161 姓名 卟咚君 学号 1606100 ...

最新文章

  1. 忘记Rxjava吧,你应该试试Kotlin的协程
  2. angular select设置默认选中_改进 Angular + Jest 项目中组件测试的调试
  3. Powerup tinyos接口实现
  4. 大数据时代 我们还有隐私吗?
  5. 使用代码获得document的related document 列表
  6. 四大门户金融业务接连中招,流量这把钥匙正被氧化
  7. solr的索引库配置
  8. 谷歌原数据保护团队技术主管:零信任实践分享
  9. 4.10验证码(抠图)和超级鹰的使用
  10. 深度学习领域,你心目中 idea 最惊艳的论文是哪篇?
  11. 【C语言】从字符串中提取正整数和负整数
  12. 回归A股成“网红”,中芯国际20年芯片发展史
  13. 一文了解Java隐式类型转换
  14. Color Constancy 色彩恒常性(1)White Patch Retinex
  15. Python实现GWO智能灰狼优化算法优化支持向量机分类模型(SVC算法)项目实战
  16. Latex的中文模板分享~~~
  17. 苹果开发者:如何将准备好的应用上传到iTunes Connect
  18. No enclosing instance of type X is accessible. Must qualify the allocation with an enclosing instanc
  19. 自动驾驶学习过程及资料整理
  20. 东华oj系统 52 k倍区间

热门文章

  1. LeetCode刷题遇到的小知识点总结
  2. 【php】PHP数据库访问
  3. 请按该计酬方式计算员工的工资。
  4. 一毕业就上了艘“火箭”,这群校招生在大公司创业
  5. 微信控制树莓派运行python_Python+树莓派+人体红外感应模块 实现微信监控
  6. c盘清理缓存垃圾路径
  7. [Openstack]一键安装Openstack测试环境
  8. 基于中医药知识图谱智能问答(二)
  9. 达梦数据库-国产的荣光
  10. 【Midjourney实操】逼真到颤抖!保姆级教程教生成效果炸裂的图片