数据结构课程设计
cin>>C.num;
if(s.NotFull())
{
cout<<"\n 请输入时间:/** **/";
cin>>C.inpark.hour>>C.inpark.minutes;
s.Push(C);
cout<<"\n 汽车"<<C.num<<"进入停车厂\n";
}
else
{
cout<<"停车场已满,该车进入便道!\n";
程序运行结果:
2 / 26
数据结构(C++语言描述)课程设计
二、题目:停车场管理问题 1、【问题描述】:
设有一个可以停放 n 辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到 达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场 的最里面)。如果停车场已放满 n 辆车,则后来的车辆只能在停车场大门外的便道上等待, 一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开 走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆 再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。 如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便 道上等待的车辆的次序。编制程序模拟该停车场的管理。
2、设计 2.1 概要设计:这个问题用到的数据类型有链式队列、链式堆栈、顺序堆栈。队列类的数据 成员有队列节点类的对头指针和队尾指针还有整数类型的计数器 count。操作集合有构造、 析构函数、入队列、出队列、非空否、取对头数据元素、随机查找及删除节点、显示队列元 素等操作。链式堆栈的数据成员有堆栈节点类型的头指针和整数类型的 size。操作集合有入 栈、出栈、取栈顶元素、堆栈非空否等操作。其中删除操作要保证 size>0。顺序堆栈类的数 据成员有 DataType 类型的堆栈数组和整数类型的栈顶指示器,操作集合有入栈、出栈、取 栈顶元素、堆栈非空否等操作。其中入栈操作要保证栈顶指示器的值小于数组的上限,删除 操作要保证栈顶指示器的值大于 0. 2.2 详细设计:本题可用以顺序栈模拟停车场,以链式队列模拟该停车场大门外的便道。需 另设一个顺序栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车。输入的数据按 到达或离去的时刻有序。栈中的每个元素表示一辆汽车,包括两个数据项:汽车的牌照号码 和进入停车场的时刻。
cin>>C.num;
if(s.Search(C))
//Search()返回查找的元素是否在栈内
{
while((s.GetTop()!=C) ) //调用运算符重载
temp.Push(s.Pop());
C=s.Pop(); //要找的车出栈 C.Print(); //打印出栈车的信息
while(temp.NotEmpty()) //退出的汽车从新进入停车场 s.Push(temp.Pop());
s.Push(tC); } else cout<<"\n 便道里没有车辆等待进入停车场。\n";
//没有车入场栈 return;
}
//便道已空,
//车不在场栈内,查找便道 else {
cout<<"\n 该车不在停车场内!\n"; if(q.NotEmpty()) {
q.Append(C);
}
}
template<class T >
void Leave(SeqStack<T> & s,LinQueue<T> & q)
{
Car C;LinStack <Car> temp;char nothing[2];
if(s.NotEmpty())
{
cout<<"请输入车牌号:";
cout<<"\n 请输入时间:/** **/"; cin>>C.inpark.hour>>C.inpark.minutes; s.Push(C); cout<<"\n 汽车"<<C.num<<"进入停车厂\n";
3 / 26
数据结构(C++语言描述)课程设计
}
else
{
cout<<"停车场已满,该车进入便道!\n";
if(!(q.Out(C))) //Out()在队列内查找元素,如果存在,删除, //并返回 1,否则返回 0
{ cout<<"\n 该车不存在!\n"; return;
} cout<<"\n 该车在便道上,不需缴纳停车费!\n"; return; } } } else cout<<"停车场已空!没有汽车!\n"; } template<class T > void List ( SeqStack<T> &s,LinQueue<T> &q) { char nothing[2]; cout<<"\n 请选择: 1. 列表显示停车场内的车辆 2.列表显示便道上的车辆 :"; int ch; while(1) { cin>>ch; if(ch!=1 && ch!=2)cout<<"\n 输入错误,请继续选择!"; else break; } if(ch==1) { if(s.NotEmpty()) s.Display(); else cout<<"\n 停车场已空!\n"; } else { if (q.NotEmpty()) q.Display(); else cout<<"\n 便道已空!\n"; } }
3、测试:输入相应数据进行测试时,发现对于从便道转入到停车场的汽车的收费不对。改正 时要将该类型汽车的入停车场时间置为为其空出车位的汽车离停车场的时间。
4、使用说明及设计总结:进行输入时要按照提示输入,注意输入的离开停车场的时间不能 早于进入停车场的时间。程序的功能实现的可以,但是还是有些冗长,找到更加精练的算法 会更好。
cin>>C.num;
if(s.Search(C))
//Search()返回查找的元素是否在栈内
{
while((s.GetTop()!=C) ) //调用运算符重载
temp.Push(s.Pop());
C=s.Pop(); //要找的车出栈 C.Print(); //打印出栈车的信息
while(temp.NotEmpty()) //退出的汽车从新进入停车场 s.Push(temp.Pop());
s.Push(tC); } else cout<<"\n 便道里没有车辆等待进入停车场。\n";
//没有车入场栈 return;
}
//便道已空,
//车不在场栈内,查找便道
4 / 26
数据结构(C++语言描述)课程设计
else {
cout<<"\n 该车不在停车场内!\n"; if(q.NotEmpty()) {
5 / 26
数据结构(C++语言描述)课程设计
其中的头文件 Car.h 代码为:
template<class T>
void Reach(SeqStack<T> & s,LinQueue<T> & q)
{
Car C;char nothing[2];
cout<<"\n 请输入车牌号(例:鲁 A1234):";
测试函数: #include<iostream.h> #include<stdlib.h> #include"LinList.h" void main(void) {
int m=3; int n=8; LinList<int> m++)
myList.Insert(i+1,i); myList.Joseph(m); }
3、测试:测试函数设计主函数接口,定义 n 与 m 的值分别为 8,3.定义一个循环单链表对 象,将各个数据插入到循环单链表中,再将 m 值传入约瑟夫函数。测试过程中出现的大部分 错误主要来自于功能函数对删除节点的前一节点定位操作的错误,后来在改正过程中添加了 k 辅助定位,解决了该问题。
4、使用说明及设计小结:使用时每次定义好 n 与 m 的值在进行操作。该程序的设计我认为 有待改进的地方还是定位操作,该解法的最终实现得益于 k 的引入。但不免失之普遍性,应 该有更好的,更易懂的算法实现。
if(q.NotEmpty()) //便道队列不空,便道车进入场栈 {
Car tC; tC=q.Delete(); cout<<"\n 便道里的车牌号为:"<<tC.num<<"的车进入停车场\n";
//设置进入停车场的时间: tC.inpark.hour=C.outpark.hour;tC.inpark.minutes=C.outpark.minutes;
2、设计: 2.1 概要设计:采用循环单链表实现,其中包括链表节点的设计及循环单链表类的设计。链 表的数据元素有头结点和节点的数目,其中头结点的数据类型设计成节点类型,节点的数目 size 设计成整数类型。循环单链表类的操作集合有构造函数、析构函数、取大小函数、定 位函数、插入函数、删除函数、取值函数以及求解该问题约瑟夫函数。其中的删除、取值等 操作要保证参数不越界的约束条件 i>=0&&i<=size-1;插入操作要满足 i>=0&&i<=size;定位 操作要使得 i>=-1&&i<=size-1. 2.2 详细设计:本问题的求解主要是对约瑟夫函数的设计。首先给该函数传入 m 的值,然后 定义一个指针指向头结点,依照题目要求设计循环条件使指针依次指向下一结点直到找到淘 汰对象,然后用事先定义的 k 记录,是指针指向淘汰节点的前一结点,再进行循环,直至完 成题目要求。