java数据结构银行叫号,数据结构实验二——队列(银行叫号系统)
一、实验目的
(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#includeint 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;
else
return 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);
else
printf("第%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"
#includeint 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;
else
return false;
}
int delFirstQueue(LinkedQueue *pQueue, QElemType *pQElem)
{
QElemType *ptmp;//临时结点指针
if (isemptyQueue(pQueue))
{
printf("队列为空,不能继续出队列\n");
return ERROR;
}
else
{
ptmp = pQueue->front->next; //让ptmp指向队列的首节点的后一个元素
*pQElem = *ptmp; //将首节点的值复制给pQElem
pQueue->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"
#includevoid 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#include #include #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;//队列编号为窗口编号-1
delFirstQueue(&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();
else
CustomerLeaved();
//显示当前事件列表,以及排队情况
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 int main()
{
BankSimulation();
}
5. 程序结果
java数据结构银行叫号,数据结构实验二——队列(银行叫号系统)相关推荐
- matlab1信号的单边z变换:,实验二 离散时间信号与系统的Z变换分析
实验二 离散时间信号与系统的Z变换分析 一. 实验目的 1.熟悉离散信号Z变换的原理及性质 2.熟悉常见信号的Z变换 3.了解正/反Z变换的MATLAB实现方法 4.了解离散信号的Z变换与其对应的理想 ...
- 利用MATLAB进行系统时域分析,实验二 利用matlab进行系统的时域分析
实验二 利用matlab进行系统的时域分析 实验二 利用MATLAB进行系统的时域分析 1.实验目的 在理论学习的基础上,通过本实验熟悉LTI连续时间系统的时域分析方法, 熟悉系统的零输入响应.零状态 ...
- 数据结构_C语言_实验二_树 ——还原二叉树
文章目录 实验二 树 1. 实验目的 2. 实验内容 3. 实验要求 4. 实验过程 (1) 问题描述 (2) 数据结构与算法设计 (3) 程序实现 (4) 实验结果 (5) 实验总结 实验二 树 - ...
- java程序面向对象show,20165309 实验二 Java面向对象程序设计
2017-2018-2 20165309实验二<Java面向对象程序设计>实验报告 一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初 ...
- 数据结构实验二——队列(银行叫号系统)
一.实验目的 (1)掌握队列的链式存储结构 (2)掌握队列的基本操作,并能进行应用实践 (3)使用C/C++语言和队列实现"银行叫号系统"专题 二.实验任务 设计一个控制台程序,模 ...
- 南京邮电大学Java软件开发(混合式)实验2:银行账户管理——面向对象
一. Java 类与对象的基本知识: 1. 类的定义 2. 方法重载 3. 构造方法 4. static 关键字 5. this 关键字 6. 包与import 语句 7. 访问权限 8. 对象的使用 ...
- 信号与系统 实验二 连续时间LTI系统的时域分析
一.实验目的 1. 学会用MATLAB求解连续系统的零状态响应: 2.学会用MATLAB求解冲激响应及阶跃响应: 3. 学会用MATLAB实现连续信号卷积的方法: 二.实验原理 1.连续时间系统零状态 ...
- java 二叉树实验报告_20172310《程序设计与数据结构》(下)实验二:二叉树实验报告...
20172310<程序设计与数据结构>(下)实验二:二叉树实验报告 报告封面 课程:<软件结构与数据结构> 班级: 1723 姓名: 仇夏 学号:20172310 实验教师:王 ...
- 数据结构实验二(C语言):银行排队系统
银行排队系统 [问题描述]假设银行只有2个窗口对外营业,顾客到银行办理业务,首先要取一个顺序号,然后排队等待叫号.被叫到号的顾客到柜台接受服务,服务完毕后离开.到了下班时间不再接收新来的顾客.顾客分为 ...
- 数据结构java实验 刘小晶_《数据结构实例解析与实验指导——Java语言描述》刘小晶著【摘要 书评 在线阅读】-苏宁易购图书...
商品参数 作者: 刘小晶著 出版社:清华大学出版社 出版时间:2013-2-1 版次:1 印次:1 印刷时间:2013-2-1 字数:619000 页数:380 开本:16开 装帧:平装 ISBN:9 ...
最新文章
- python数据分析基础 余本国_Python数据分析基础
- 合伙人分开的一点思考
- MyEclipse 9.x Professional/blue/spring/bling 下载与破解
- cocos2d-x jsbinding 在线更新策略设计
- Haar小波变换的快速实现
- kalixfce不能启动_kali升级2019.4后切换xfce桌面
- ssh图片上传 java_ssh上传并显示图片
- Axios的Vue插件(添加全局请求/响应拦截器)
- VC中使用ADO的方法
- Linux下tomcat的配置
- 正襟危坐说--操作系统(肆):线程
- 分析百度的中文分词结果
- mysql忘记密码时如何修改root用户密码
- 使用EDD枚举域数据
- ADSL密码查看器绿色版
- js打开新页面的几种方式
- 使用bootstrap打造卡片个人简历
- 新手程序员进阶必学,Python常用模块及用法汇总(内容较干建议收藏)
- Android 腾讯Bugly热更新笔记
- 以太坊之dapp例子