营业窗口队列模拟
海纳百川,大道致远
时光荏苒,青春在这里生长,为了理想我们在这里摩拳擦掌,
岁月不居,梦想依旧灿烂,纯真的理想在这里放飞。
要求及功能
实现具有n个窗口的现实队列模拟,统计每人的等待时间。
1). 随机产生顾客的到达时间和服务时间存盘。
2). 实现队列的插入和删除。
3). 当有顾客离开时,根据队列长度调整队尾。
4). 考虑顾客中途离队的情况。
5). 考虑顾客具有优先级的情况。
思路与理解
本数据结构课程设计的问题是营业窗口模拟问题。使用了随机数,队列,数组,排序等方法,以计算机代码进行营业窗口的队列模拟。
课程设计需解决的问题是营业窗口的模拟。我们的解决思路是首先通过随机数生成,将顾客的到达时间等数据存盘;接着将他们的到达顺序进行重新排列并按时间先后顺序进行标号;然后进行营业队列的入队、出队和中途离队的排队模拟;最后进行统计输出。
思维导图分析
具体的代码实现
具体的函数
头文件部分,以及一些初始化的定义
#pragma once
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define K 6 //窗口数量
#define N 200 //来了多少的顾客
#define MaxSize N //将队列的长度用来了多少人来定义
int Q = 0; //中途离开的客户统计
LinkQueue* temp = NULL; //把那个用来中途离开后的中途队列给全局
//定义时间
struct thetime
{
int h;
int m;
};
//定义每个客户的到达银行时间,等待时间,开始办理时间,
//处理时间,结束时间(离开银行时间),身份
struct customers
{
thetime ArriveTime; //到达银行时间
thetime WaitTime; //等待时间
thetime StartTime; //开始办理时间
thetime FinishTime; //结束办理时间
int BusinessTime; //处理时间,处理时间为整数
int QueueNumber; //客户进入银行的序号,先用来标记
int VIP; //定义是否是VIP
};
typedef struct _tag_Node
{
customers data;
struct _tag_Node* next;
} DataNode; //链队数据结点
typedef struct
{
DataNode* front;
DataNode* rear;
} LinkQueue; //链队头结点
//初始化队列
void CreateQueue(LinkQueue*& queue);
//销毁队列
void DestroyQueue(LinkQueue* queue);
//队列的长度
int QueueLength(LinkQueue* queue);
//出队操作
bool deQueue(LinkQueue*& queue, customers& e);
//入队操作
void enQueue(LinkQueue*& queue, customers e);
//队列是否为空
bool QueueEmpty(LinkQueue* queue);
//欢迎界面函数
void welcom();
void end();
//用户到达银行时间表函数
void customers_time(struct customers& customer);
//按用户的到达时间将顾客的先后顺序进行排序(由于顾客的到达时间是随机产生的)
void customer_sort(customers customer[]);
//随机是否离队
bool IsLeaf(int n);
//判断顾客需要去哪个窗口排队,算出等待时间最少的队列
int judge_queue_in(LinkQueue* queue[], customers& customer, int QueueCustomerNumber[]);
//展示窗口服务情况,主要是看有没有错误,后面可以去掉
void ShowQueue(LinkQueue* queue[]);
//判断下一个顾客到来时,哪个队列的队首客户是否已经办理完业务,并进行出队