一歌小项目,高手进来
实训目的要求:1.掌握栈和队列的基本概念。
2.通过实验进一步加深理解栈的经过及其有关算法。
实训内容:
模拟停车场问题:
队列设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的先后次序从停车场最里面向门口处停放(最先到达的第一辆车停在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就可进入停车场。停车场内如有某辆车要开走,在它之后进入停车场的车辆都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进入。每辆车在离开停车场时,根据它在停车场内停留时间的长短交费。如果停在便道上的车辆未进停车场就要离去,允许其离去时不收停车费,并且仍然保持在便道上等待的车辆的次序。现在编制一个程序来模拟停车场的管理。
说明:
首先确定模拟程序中需要的数据结构及其操作。
由于停车场只有一个大门,因此可用一个栈来模拟;根据便道停车的特点,先排队的车辆先离开便道进入停车场,可以用一个队列来模拟;又因为排在停车场中间的车辆可以提前离开,因此还需要有一个地方(车辆规避所)保存为了让路离开停车场的车辆,很显然这也应该用一个栈来模拟。所以在程序中设置了两个顺序栈s1和s2分别表示停车场和规避所;设置了一个链队列q表示便道。它们的数据类型定义在下面的源程序中,为了操作方便,链队列表头结点中的num域中存放便道上的车辆数量。
程序执行时,当输入数据表示有车辆到达时,判断栈s1是否满,若未满就将新数据进栈s1;若栈已满,就将数据入队列q,表示车辆在便道上等待进入停车场。该操作过程由函数Arrive完成。当输入数据表示有车辆要离去时,就在栈s1中寻找此车牌号的车辆,如寻找到就让其离开停车场,并根据停车时间计费,同时将队列q的队头元素进栈s1;如没有找到,就到队列q中去寻找此车牌号的车辆。如在队列q中找到就允许其离开队列,并不收费;如找不到就显示出错信息。当离开停车场的车辆位于栈s1的中间时,必须先将此位置到栈顶之间的所有数据倒到栈s2中去,然后安排车辆出栈s1,最后将栈s2中的数据倒回到栈s1中来。该操作过程由函数Delive完成。显然,以上两个主要操作需要利用栈和队列的两个基本操作入栈(队列)和出栈(队列)来实现。源程序中的函数Display则可以随时显示停车场的状况。