用C++编写停车场管理模拟系统

一、内容和要求
设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。
设计时还可以考虑以下因素:
(1)汽车可有不同种类,则它们的占地面积不同,收费标准也不同,如1辆客车和1.5辆小汽车的占地面积相同,1辆十轮卡车占地面积相当于3辆小汽车的占地面积。
(2)汽车可以直接从便道上开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾。
二、实现提示
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车离去;则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表实现。
需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。
本程序可以分为四大模块:程序功能介绍和操作提示模块;汽车进入停车位的管理模块、汽车离开停车位的管理模块、查看停车场停车状态的查询模块。要求界面简洁、友好,容错性好。

第1个回答  2009-06-12
这个是我课程设计的,比较粗糙的一个程序,有一些功能也不是很完善。看能不能给你一点帮助~~~

#include<iostream>
using namespace std;
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 100
#define STACKINCRENT 10
#define NULL 0
struct SNode{
char CState;
int CNumber;
int CTime;
};//定义一个结构体结点
typedef struct {
SNode *base;
SNode *top;
int stacksize;
}SqStack;//分配栈的存储空间
typedef struct QNode{
SNode date;
struct QNode *next;
}QNode,*QueuePtr;//队列链表结点
typedef struct {
QueuePtr front;
QueuePtr rear;
}LinkQueue;//分配队列的存储空间

//////////////////////////////////////////////////
//函数的建立
int InitStack(SqStack &S){
//构造一个栈
S.base=new SNode[STACK_INIT_SIZE];
if(!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
int Push(SqStack &S,SNode e){
//入栈
*S.top++=e;
return OK;
}
int Pop(SqStack &S,SNode &e){
//出栈
if(S.top==S.base)return ERROR;
e=*--S.top;
return OK;
}

int InitQueue(LinkQueue &Q){
//建一个空队列
Q.front=Q.rear=new QNode;
Q.front->next=NULL;
return OK;
}
int EnQueue(LinkQueue &Q,SNode e){
//入队列
QNode *p;
p=new QNode;
if(!p)exit(OVERFLOW);
p->date=e;
Q.rear->next=p;
Q.rear=p;
return OK;
}
int DeQueue(LinkQueue &Q,SNode &e){
//出队列
if(Q.front==Q.rear) return ERROR;
QNode *p;
p=new QNode;
p=Q.front->next;
e=p->date;
Q.front->next=p->next;
if(Q.rear==p)Q.rear=Q.front;
delete(p);
return OK;
}
////////////////////////////////////////////
int main(){
SqStack S1,S2;
LinkQueue Q;
InitStack(S1);
InitStack(S2);
InitQueue(Q);
/*构造两个空栈S1,S2和一个队列Q*/
int n,price,i=1;
cout<<"停车场有多少个位置?"<<endl;
cin>>n;
cout<<"每分钟的价格是多少?"<<endl;
cin>>price;
SNode k;
do{
cout<<"输入信息"<<endl<<"汽车“到达”或“离去”信息(这里输入(A(到达) D(离去) E(结束))),汽车牌号码以及到达或离去的时刻"<<endl;
cin>>k.CState>>k.CNumber>>k.CTime;
if(k.CState!='A'&&k.CState!='D'&&k.CState!='E'){
cout<<"输入错误,请重新输入"<<endl;
continue;
}
if(k.CState=='A'){
if(S1.top-S1.base>=n){
EnQueue(Q,k);
cout<<"停车场已满,车子放在便道上的"<<i++<<"号位上"<<endl;
}//如果栈满,入队列并输出在便道上几号位
else {
Push(S1,k);//K入栈
cout<<"车子放在停车场的"<<S1.top-S1.base<<"号位上"<<endl;
}
}//到达状态的处理
else if(k.CState=='D'){
SNode e,a,g;
while(1){
Pop(S1,e);//删除栈顶元素,返回一个e
if(e.CNumber==k.CNumber){//如果返回的车牌和输入的车牌一样就输出停留时间和所需费用
int time,money;
time=k.CTime-e.CTime;
money=time*price;
cout<<k.CNumber<<"号车停留时间为"<<time<<endl;
cout<<"应缴纳的费用为"<<money<<"元"<<endl;
while(S2.top-S2.base!=0){//S2不空就把S2的元素给S1
Pop(S2,a);
Push(S1,a);
}//while
while(S1.top-S1.base<n&&Q.front!=Q.rear){//栈S1不空,就从队列中取出元素放入S1中,直到栈s1满或队列中没有元素了
DeQueue(Q,g);
i--;
Push(S1,g);
}//while
break;//当弹出的e和我们输入的k车牌号一样时跳出循环体
}//if
else Push(S2,e);//当弹出的e和我们输入的k车牌号不一样时,e入栈s2且继续循环体

}//while
}//离去状态的处理
}while(k.CState!='E');//当状态为结束时 结束输入
return 0;
}//main

参考资料:数据结构

本回答被提问者采纳
第2个回答  2009-06-12
别等了 没人会给你做的
相似回答