一.问题描述
假设某银行有四个窗口对外接待客户,从早晨银行开门起不断有客户进入银行。由于每个窗口只能接待一个客户,因此在客户人数众多时需在每个窗口前顺次排队,对于刚进入银行的客户,如果某个窗口的业务员正在空闲,则可上前办理业务,反之,若四个窗口均有客户所占,他便会排在队伍的后面。现在需要编写一个程序以模拟银行的这种业务活动,并计算一天中客户在银行逗留的平均时间。
为了计算这个平均值,我们要掌握每个客户到达银行和离开银行这两个时间,后者减去前者即为每个客户在银行的逗留事件。所有客户逗留时间的总和被一天内进入银行的客户数除便是所求的平均时间。
假设客户到达后即可办理业务,则他在银行的逗留时间即为他办理业务所需的时间;否则需加上他排队等候的时间。
二.数据结构分析
下面我们来讨论模拟程序所需的数据结构。
显然,需要四个队列以表示四个窗口前的客户队列,队列中每个元素标识排队等候的客户,队尾元素为最迟进入银行的客户,而队头元素则表示正被银行业务员接待的客户。
只有下列五种情况发生会促使队列发生变化:一种情况是新的客户进入银行,他将加入元素最少的队列而成为该队列新的队尾元素;另四种情况是某个正被业务员接待的客户办理完业务离开银行。
整个模拟程序就是按时间先后顺序一个接一个处理这些事件。这样一种模拟程序称作事件驱动模拟。
假设事件表中最早发生的事件是新客户到达,则随之应得到两个时间:
一是本客户办理业务所需时间;二是下一个客户将到达银行的时间间隔。
此时模拟程序应做的工作是:
1)比较四个队列中的个数,将新到客户加入到元素个数最少的队列中成为新的队尾元素。若该队列原为空,则刚插入的队尾元素也是队头元素,此时应设定一个事件——刚进入银行的客户办理完业务离开银行的事件,并插入事件表;
2)设定一个新的事件——下一个客户即将到达银行的事件,插入事件表;
若最早发生的事件是某个队列中的客户离开银行,则模拟程序需要做的工作是:
1)该客户出队列,并计算他在银行逗留时间;
2)当该队列非空时,计算新的队头元素将离开银行的时间,并由此设立一个

本文介绍了如何使用事件驱动法模拟银行客户排队办理业务的过程,涉及数据结构(如队列和事件表)、单链表的存储结构实现,以及如何计算客户平均逗留时间的算法。

1515

被折叠的 条评论
为什么被折叠?



