数据结构银行排队问题

实验任务

银行排队模拟程序功能
假设某银行有四个窗口对外接待客户,从早晨银行开门起不断有客户进入银行。由于每个窗口只能接待一个客户,因此在客户人数众多时需在每个窗口前顺次排队,对于刚进入银行的客户,如果某个窗口的业务员正在空闲,则可上前办理业务,反之,若四个窗口均有客户所占,他便会排在队伍的后面。现在需要编制一个程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的平均时间。

前期准备工作

  • 链式队列书写完毕
  • 带头结点单向不循环链表按顺序插入节点已掌握

算法大致思路

1.2个重要的数据结构
  • 事件链表
  • 队列数组

image-20210530102000635

2.某个时刻运行状态

image-20210530102113272

解释如下:

  • 事件链表

    • 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();
};

4.运行流程模拟

image-20210530105052553

image-20210530105145652

image-20210530105209745

image-20210530105242810

image-20210530105303345

image-20210530105342301

img

img

img

img

img

img

img

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值