插队买票本实验假设售票大厅有多个售票窗口,无论到哪个窗口买票都必须排队,但是新来的人不一定排在队尾,允许插队(即直接排在朋友的后面).假设已经在排队的人不会离开,也不会移到
来源:学生作业帮助网 编辑:六六作业网 时间:2024/11/25 11:58:53
插队买票本实验假设售票大厅有多个售票窗口,无论到哪个窗口买票都必须排队,但是新来的人不一定排在队尾,允许插队(即直接排在朋友的后面).假设已经在排队的人不会离开,也不会移到
插队买票
本实验假设售票大厅有多个售票窗口,无论到哪个窗口买票都必须排队,但是新来的人不一定排在队尾,允许插队(即直接排在朋友的后面).
假设已经在排队的人不会离开,也不会移到其他队伍去.买到票的人依次出队.每个人仅买一次票,买完票就离开.每个人都有名字.
每个来买票的人先进行观察判断:
1. 如果所有的队伍中都没有发现朋友,则选择最短的队伍排在其队尾;
2. 如果所有的队伍中仅发现一个朋友,则可以(不是必须)插在此朋友的后面;但是,插队前应考查是否合算,插入此位置离窗口的距离(即队伍前面的人数)必须小于其他队伍的长度,否则应选择最短的队伍排在其队尾;
3. 如果所有的队伍中发现多个朋友,这种情况就比较复杂:
(1) 如果多个朋友是集中在一个队伍里,则可以插在最后那个朋友的后面;
(2) 如果多个朋友是分散在多个队伍里,则插队的原则是离售票窗口最近;
4. 如果朋友排在队伍的第一位(即队首),则不允许插队;
本实验要求编写程序模拟这种排队买票时允许插队的情形.要求程序中应用散列表来存放和查找数据,应用求余法构造合理的散列函数,应用平方探测法来解决Hash映射的冲突现象.程序可能需要四个文本文件:
(1) 初始化文件input.txt,包含售票窗口及其购票队伍的初始设置
(2) 朋友组文件friend.txt,同一个名字也可能出现在不同的组
(3) 来购票的人的完整名单people.txt,其中包含出现在friend.txt中的名字;文件中名字的顺序表示不同的到来顺序;文件中每行有一个名字,如果某行有多个名字则表示他们同时到达售票厅(这是比较复杂的情形)
(4) 售票结果文件output.txt(按售票窗口分组显示),可以考虑各窗口卖票的节奏(即售票员的售票速度)
插队买票本实验假设售票大厅有多个售票窗口,无论到哪个窗口买票都必须排队,但是新来的人不一定排在队尾,允许插队(即直接排在朋友的后面).假设已经在排队的人不会离开,也不会移到
实验项目:插队买票
实验目的:
(1)掌握存放大量数据的方法(主要是姓名);
(2)掌握查找大量数据的方法(主要是姓名);
(3)掌握队列的定义及操作.;
涉及的知识点:
(1)用散列表来存放和查找数据的方法;
(2)散列表的各种冲突解决方法;
(3)队列的定义及操作.
实验内容:
在每个队伍允许插队的情况下,若你在排队,有一个以上的朋友要求插队,你可以安排他们的顺序,每次一个人入队,并且如果这个入队的人发现队伍中有自己的朋友,则可以插入到这个朋友的后面,当队伍中的朋友不止一个时,这个人会排在最后一个朋友的后面.若队伍中没有朋友,则排在队伍的最后面.每一个入队的人都先进行上述判断.当队伍前面的人买到票后,依次出队.
//grouppos.cpp
#include
#include
#include
#include
#define TabSize 2000003 /*散列表大小TabSize 是大于表最大空间的素数*/
#define Max 1000001 /*队列空间最大值*/
class hashtab /*散列表数据结构*/
{public:
char name[5]; /*名字*/
int group; /*属于哪个朋友组*/
char info; /*标志位,该单元是否被占用*/
};
class PtrToHash:public hashtab{};
class Que /*队列数据结构*/
{public:
long int HashVal; /*散列值*/
long int Index; /*在中的队列序号*/
};
class PtrToQue:public Que{};
int hashedx=0; /*标记元素是否已经在散列表里*/
long int Find(PtrToHash *hash,char *c) /*查找在散列表中的位置*/
{
char *key;
long int CurrentPos,CollisionNum;
key=c;
for(CurrentPos=0;*key;++key) /*散列函数,计算散列值*/
CurrentPos=(CurrentPos