实验任务
银行排队模拟程序功能
假设某银行有四个窗口对外接待客户,从早晨银行开门起不断有客户进入银行。由于每个窗口只能接待一个客户,因此在客户人数众多时需在每个窗口前顺次排队,对于刚进入银行的客户,如果某个窗口的业务员正在空闲,则可上前办理业务,反之,若四个窗口均有客户所占,他便会排在队伍的后面。现在需要编制一个程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的平均时间。
前期准备工作
- 链式队列书写完毕
- 带头结点单向不循环链表按顺序插入节点已掌握
算法大致思路
1.2个重要的数据结构
- 事件链表
- 队列数组
2.某个时刻运行状态
解释如下:
-
事件链表
- occurTime :表示事件发生时间
- ntype:表示事件类型,-1表示新客户到达,0-3表示0-3号窗口老客户离开时间
-
队列数组:
由四个队列对象组成
对每个队列对象:
- arrivalTime: 表示当前客户到达时间
- duration:表示当前客户办理业务时间
3.2个重要的数据结构代码
- 队列数组
#define datatype Client
//银行客户,队列节点的data域
typedef struct Client
{
int arrivalTime;//当前客户到达时间
int duration;//当前客户的服务时间
}Client;
//队列节点
typedef struct Node
{
Clinet data;
struct Node *next;
}Node;
//使用带头结点单链表来做,队列类
class LinkQueue
{
private:
Node *rear, *front;
int length;//队列中的元素个数
public:
LinkQueue();
~LinkQueue();
bool getFront(datatype *item);
void enQueue(datatype item);
bool deQueue(datatype *item);
bool isEmpty();
void clearQueue();
void displayQueue();
int queueLength();
};
- 事件链表
typedef struct evNode
{
int occurTime;//事件发生时间
int nType;//事件类型,-1表示到达事件,0-3表示0-3窗口离开事件
struct evNode *next;
}evNode;
class EvList
{
private:
evNode *head;
public:
LinkList();
~LinkList();
bool insertNode(int occurTime,int nType);//按顺序插入
bool deleteNode(int *occurTime,int *nType);//首部删除
void displayNode();
bool isEmpty();
};