一、实验目的

(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数据结构银行叫号,数据结构实验二——队列(银行叫号系统)相关推荐

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

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

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

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

  3. 数据结构_C语言_实验二_树 ——还原二叉树

    文章目录 实验二 树 1. 实验目的 2. 实验内容 3. 实验要求 4. 实验过程 (1) 问题描述 (2) 数据结构与算法设计 (3) 程序实现 (4) 实验结果 (5) 实验总结 实验二 树 - ...

  4. java程序面向对象show,20165309 实验二 Java面向对象程序设计

    2017-2018-2 20165309实验二<Java面向对象程序设计>实验报告 一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初 ...

  5. 数据结构实验二——队列(银行叫号系统)

    一.实验目的 (1)掌握队列的链式存储结构 (2)掌握队列的基本操作,并能进行应用实践 (3)使用C/C++语言和队列实现"银行叫号系统"专题 二.实验任务 设计一个控制台程序,模 ...

  6. 南京邮电大学Java软件开发(混合式)实验2:银行账户管理——面向对象

    一. Java 类与对象的基本知识: 1. 类的定义 2. 方法重载 3. 构造方法 4. static 关键字 5. this 关键字 6. 包与import 语句 7. 访问权限 8. 对象的使用 ...

  7. 信号与系统 实验二 连续时间LTI系统的时域分析

    一.实验目的 1. 学会用MATLAB求解连续系统的零状态响应: 2.学会用MATLAB求解冲激响应及阶跃响应: 3. 学会用MATLAB实现连续信号卷积的方法: 二.实验原理 1.连续时间系统零状态 ...

  8. java 二叉树实验报告_20172310《程序设计与数据结构》(下)实验二:二叉树实验报告...

    20172310<程序设计与数据结构>(下)实验二:二叉树实验报告 报告封面 课程:<软件结构与数据结构> 班级: 1723 姓名: 仇夏 学号:20172310 实验教师:王 ...

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

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

  10. 数据结构java实验 刘小晶_《数据结构实例解析与实验指导——Java语言描述》刘小晶著【摘要 书评 在线阅读】-苏宁易购图书...

    商品参数 作者: 刘小晶著 出版社:清华大学出版社 出版时间:2013-2-1 版次:1 印次:1 印刷时间:2013-2-1 字数:619000 页数:380 开本:16开 装帧:平装 ISBN:9 ...

最新文章

  1. python数据分析基础 余本国_Python数据分析基础
  2. 合伙人分开的一点思考
  3. MyEclipse 9.x Professional/blue/spring/bling 下载与破解
  4. cocos2d-x jsbinding 在线更新策略设计
  5. Haar小波变换的快速实现
  6. kalixfce不能启动_kali升级2019.4后切换xfce桌面
  7. ssh图片上传 java_ssh上传并显示图片
  8. Axios的Vue插件(添加全局请求/响应拦截器)
  9. VC中使用ADO的方法
  10. Linux下tomcat的配置
  11. 正襟危坐说--操作系统(肆):线程
  12. 分析百度的中文分词结果
  13. mysql忘记密码时如何修改root用户密码
  14. 使用EDD枚举域数据
  15. ADSL密码查看器绿色版
  16. js打开新页面的几种方式
  17. 使用bootstrap打造卡片个人简历
  18. 新手程序员进阶必学,Python常用模块及用法汇总(内容较干建议收藏)
  19. Android 腾讯Bugly热更新笔记
  20. 以太坊之dapp例子

热门文章

  1. Java课程设计报告
  2. 全员系统的服务器地址,江西省全员人口信息系统登录(全员系统查询)
  3. 使用V-ASSISTANT软件配置V90伺服驱动器参数的具体步骤详解
  4. 【问题导向】GWR与MGWR——以南京市中心城区住宅小区为例
  5. 地理加权回归GWR4.0软件下载与使用
  6. 基于SSM的物业管理系统-JSP MYSQL小区物业费管理系统
  7. ukij手机字体_微信小程序一些常见的坑
  8. python Copula 模型实现
  9. 从B站源码里探索推荐算法的奥义
  10. Ubuntu14.04上安装CSI tool