一、设计内容
- 设计有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出,车辆按照到达停车场时间的先后次序依次从停车场最里面向大门口出停放(即最先到达的第一辆车停放在停车场最里面),如果停车场已放满n辆车,则以后到达的车辆只能在停车场大门外的便道上等待,一旦停车场内有车离开,则排在便道上的第一辆车可以进入停车场,停车场内如有某辆车要开走,则在它之后进入停车场的车都要先退出停车场为它让路,待其开出停车场后,这些车辆再按照原来的次序进场。
二、设计分析
1.实现停车场的结构
因为停车场它只有一个大门可以供车辆进出,车辆按照到达停车场时间的先后次序依次从停车场最里面向大门口出停放(即最先到达的第一辆车停放在停车场最里面),很容易让人联想的栈,所以我们停车场内部用栈来实现。如果停车场已放满n辆车,则以后到达的车辆只能在停车场大门外的便道上等待,一旦停车场内有车离开,则排在便道上的第一辆车可以进入停车场,那么很明显停车场外的便道是一个队列的结构,先进先出,也就是先到先进。这样就确定了停车场的基本机构,即停车场内用栈来贮存,停车场外便道用队列来贮存。
2.停车场的功能
个人认为一个停车场该有的功能:
1.车辆开进停车场
2.车辆开出停车场
3.查询停车场内车的数量
4.查询停车场内车的编号
5.查询停车场外车的数量
6.查询停车场外车的编号
7.查询停车场内是否有空余
8.查询停车场外一辆车需等待几辆车
-
- 第一个功能是车辆开进停车场,这是一个停车场最基本的功能,实现对车辆的停放。
- 第二个功能是车辆开出停车场,这个功能值得注意的是,开出停车场的车辆可以是停在停车场的任意一辆,并且车辆开出去后,所有在这辆车开进之后的车辆均要向前移位,最后还需要判断停车场外(即便道内)是否有车可以停进停车场内。
- 第三个功能是查询停车场内车的数量,这个功能其实在功能4—查询停车场车的编号就可以看出来,但假如数字过大,人为计数就会显得复杂,所以增加这个功能能让停车场车的数量很清晰呈现在我们面前。
- 第四个功能是查询停车场内车的编号,首先这个编号顺序应该是车辆停入的先后时间确定,其次,我们有了这个功能,我们实现车辆开出停车场时,能很明显感受到车辆的变化。
- 第五个功能是查询停车场外车的编号,因为停车场外并没有规定能容纳多少车辆,所以这个功能是作为一个参考。
- 第六个功能是查询停车场外车的编号(是由进入停车场的优先顺序进行输出),这样我们就可以清楚的观察当有停车场外车进入停车场时,停车场外车辆的变化。
- 第七个功能是查询停车场内是否有空余,这样就可以给开入停车场的车辆提示,是否它们能开进停车场。
- 第八个功能是查询停车场外一辆车需等待几辆车,停车场外的车辆时任意的,没有要求的,我们只需要你给出车的编号,我们就可以查询车辆前方需等带几辆车,这样就可以给暂时不能停入停车场的车辆一个时间预期。
3.停车场代码的实现
一.构建停车场内栈结构和停车场内队结构:一开始我想用结构体动态模拟一个栈和队列,但是两个结构的动态构建会让代码很复杂,而且所需的空间和时间复杂度都很高,所以我换用数组静态模拟栈和队列,不仅节省了大量空间,也提高了时间效率,增加了代码的简洁性和可读性。
-
-
- 构建停车场内栈结构:我用静态数组模拟栈的实现,首先定义一个stk[]数组,里面贮存的值是车辆的编号,再定义int tt,tt类似于栈的头指针,当有元素进栈栈,栈顶指针往后移,并将元素值赋予stk[tt],简化可以写为stk[++tt]=m,这样我们就实现了栈的功能,比如栈内元素个数就等于tt,stk[tt]就是最后一辆车的编号。
- 构建停车场外的队列结构:我也是用数组静态模拟来实现队列结构。首先定义数组q[],int hh=0,int gg=-1,数组q里面贮存的也是车辆的编号,hh类似于头指针,gg类似于尾指针,这样我就构建了一个队列结构。比如,队内的元素个数为:gg-hh+1,q[hh]代表队头元素,hh--表示出队。
-
二.实现停车场功能的结构:我选择采用主菜单的格式呈现再页面上,然后你无论如何都要进行一次操作,我就采用了do-while循环,循环内部使用switch-case结构一一对应每种操作,并且加入default来判断是否正确输入操作编号。
三.实现停车场的功能:
-
-
- 车辆开进停车场:首先我们应该判断停车场内是否有空位,有的话车辆停入停车场内,否侧车辆停入停车场外侧便道内,所以我们可以将功能1和功能7结合在一起实现,因为tt代表栈中元素个数,如果tt<n的话,即停车场内有空余,可以停进停车场,否侧停进外侧便道,我们每停入一辆车就相当与进栈即stk[++tt]=m,再让tt与n进行判断。
- 车辆开出停车场:首先要判断你想要开出的车辆是否再停车场内,如果在就将车开出停车场,否侧提示重新输入。其次车辆开出停车场需要在它之后开进停车场的车让路,我的做法是将我需要开出的那辆车进行移位,将它移入栈头,在tt—将它出栈,它后面的车都前进一位。最后我们还要将队列中的车进栈,停车场开出一辆车有一个空余,我先判断队列中是否有车,即队列是否为空(hh<=gg),队列空就就不需要出队,反之,需要将对头元素进入栈头stk[++tt]=q[hh++]。这样我就完成了整个车辆开出停车场的过程。
- 查询停车场内车的数量:这个很简单,直接输出tt即可。
- 查询停车场内车的编号:对我的栈进行一次循环遍历即可。
- 查询停车场外车的数量:这个也很简单,直接输出gg-hh+1即可。
- 查询停车场外车的编号:也是对队列进行一次循环遍历即可。
- 查询停车场内是否有空余:结合功能i实现。
- 查询停车场外一辆车需等待几辆车:首先判断停车场外是否有车,即队不为空,再进一步查询车辆编码是否存在,我用一个变量flag=1进行判断,对队列进行一次循环遍历,如果能查找到相同的编号,就让flag=0,最后通过flag判断是否存在,最后一定要回溯,让flag再次等于1,不然下次判断的时候会判断失误。查询车辆编码时,我再用变量count进行计数,从队头开始查找,如果没找到count++,找到直接就break结束循环。
-
四、代码展示
#include <iostream>using namespace std;int stk[100000],q[100000],tt=0,hh=0,gg=-1;int main()
{int n,x,m,k,flag = 1;;cout << "请输入停车场的容量" << endl;cin >> n;do{cout << "----------------------------------------------" << endl;cout << "---***课程设计-停车场管理系******************---" << endl;cout << "---***请输入你的操作***********************---" << endl;cout << "---***1.车辆开进停车场*********************---" << endl;cout << "---***2.车辆开出停车场*********************---" << endl;cout << "---***3.查询停车场内车的数量***************---" << endl;cout << "---***4.查询停车场内车的编号***************---" << endl;cout << "---***5.查询停车场外车的数量***************---" << endl;cout << "---***6.查询停车场外车的编号***************---" << endl;cout << "---***7.查询停车场外一辆车需等待几辆车*****---" << endl;cout << "---***0.结束操作***************************---" << endl; cout << "----------------------------------------------" << endl;cin >> x;switch(x){case 1:cout << "请输入开进车的编号" << endl;cin >> m;if(tt<n){cout << "停车场内有空余,车辆可以开进停车场" << endl;stk[++tt] = m;}else {cout << "停车场内没有空余,车辆请开进便道等待" << endl;q[++gg] = m; } break;case 2:cout << "请输入第几辆车开出停车场" << endl;cin >> k;if(tt==0) cout << "停车场目前没有车,无法开出停车场" << endl;else{if(k==tt) {cout << "停车场内有车,可以开出停车场,编号为" << stk[tt] << endl;tt--;}else{int j;cout << "停车场内有车,可以开出停车场,编号为" << stk[k] << endl;for(int i=k;i<tt;i++) {j = stk[i];stk[i] = stk[i+1];stk[i+1] = j;}tt--;} } if(hh<=gg&&tt<=n) {cout << "便道内有车,可以开进停车场" << endl;cout << "开进停车场的车编号为" << q[hh] << endl; stk[++tt] = q[hh++];}else cout << "便道内无车,车辆可以直接开进停车场" << endl;break;case 3:if(tt<n) {cout << "目前停车场内车编号为:" << tt << endl;cout << "车未停满,可以在开进车辆" << endl;}else {cout << "目前停车场内车有:" << tt << endl;cout << "车已停满,请开进便道" << endl;}break;case 4:cout << "停车场内的车编号为:(按开进时间快慢)" << endl; for(int i=1;i<=tt;i++)cout << stk[i] << ' ';cout << endl; break;case 5:if(hh<=gg)cout << "便道内有车,数量为:" << gg-hh+1 << endl;elsecout << "便道内无车,可以直接开进停车场" << endl; break;case 6:cout << "停车场外车的编号为:(按先进停车场的顺序)" << endl;for(int i=hh;i<=gg;i++)cout << q[i] << ' ';cout << endl;break;case 7:cout << "请输入停车场外任意一个车的编号" << endl;cin >> m; if(hh>gg) cout << "便道内没有车!无法查询." << endl;else {for(int i=hh;i<=gg;i++)if(q[i]==m) flag=0; if(flag) cout << "便道内没有该车,请重新输入" << endl;else {cout << "便道内有该车" << endl; int count = 0;for(int i=hh;i<=gg;i++){if(q[i]==m) break;else count++;}if(count==0) cout << "下一辆进停车场的车就是你" << endl;else cout << "你还需要等待" << count << "车" << endl;}flag = 1;} break;case 0: break;default: cout << "输入错误!请重新输入!" << endl;break;}}while(x);return 0;
}