本项目为银行服务场景下的队列操作模拟系统,旨在通过编程实现客户排队、业务办理等流程自动化管理,优化服务效率。
要求:客户业务分为两种类型。第一种是申请从银行获得一笔资金,即取款或借款;第二种则是向银行投入资金,也就是存款或者还款操作。在这家银行里设有两个服务窗口,并且每个窗口对应一个队列。当顾客到达后先加入第一个队列等待办理业务。处理每位客户时,如果属于第一种情况并且申请金额超出当前银行现有总额,则该客户的请求会被拒绝并重新排入第二个队列中继续等候;直到满足条件为止才离开银行;否则在完成交易之后立即离店。
对于第二种类型的客户服务完成后,系统会依次检查第二队列中的等待客户。如果有符合条件的客户可以得到服务则直接处理其申请,并将不能即时获得所需资金的人安排回到该队尾重新排队。需要注意的是,在此过程中一旦发现当前可用金额少于或等于上一个完成第一类业务客户的数额时或者已经彻底审视完第二个队伍,就停止检查并继续为第一个队列中的客户办理服务。
任何时刻仅开放一个窗口进行操作,并且整个过程不考虑审核时间消耗。营业结束前所有存款人将直接离开银行不再等待。设计这样一个银行业务的事件驱动模拟系统来通过仿真方法计算出每位顾客在银行内停留的时间平均值。
[测试数据] 假设一天开始时,该行有10,000元资金,并且全天运营时间设定为600分钟。其他参数需自行确定。需要考虑两种极端场景:一是到达事件之间的间隔非常短而每个客户的交易耗时很长;另一种则是相反的情况。
[实现提示] 本题目中的“事件”可分为两类,即进入银行和离开银行的时刻点。初始情况下设定为total表示当前可用资金总量,在开始营业后第一个出现的是客户抵达时间,并且整个业务时段从0分钟到closetime结束。
每当发生到达事件时随机生成该客户的交易耗时以及下一个到达的时间间隔;同时每位顾客要处理的资金数量也是随机确定的,分别用正负值代表第一种和第二种类型的服务请求。变量total、closetime及上述两个随机量的相关范围均需从终端读取作为模拟参数。
对于队列结构而言建议采用动态分配内存的方法来实现,并且特别注意如何设计第二个等待队伍以便于高效地执行查找与插入操作。此外,事件列表需要按照时间顺序进行排序以确保逻辑正确性。