求 数据结构课程设计-停车场管理
2、设计题目要求:1.以栈模拟停车场,以队列模拟车场外的便道,按照输入数据序列进行模拟管理。2.包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码、到达或离去的时刻...
2、设计题目要求:
1.以栈模拟停车场,以队列模拟车场外的便道,按照输入数据序列进行模拟管理。2.包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码、到达或离去的时刻。3.每一组输入数据操作后的输入信息为:当车辆要进入停车场时,检查停车场是否已满,如果未满则车辆进入停车场;如果停车场已满,则车辆进入便道等候。输出汽车在停车场内或便道上的停车位置;若车辆离去,则输出汽车在停车场内停留的时间和停车费(在便道上停留的时间不收费)。4.栈以顺序结构实现,队列以链表结构实现。
细化到每个函数的作用。。。概要设计、详细设计。。。。 展开
1.以栈模拟停车场,以队列模拟车场外的便道,按照输入数据序列进行模拟管理。2.包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码、到达或离去的时刻。3.每一组输入数据操作后的输入信息为:当车辆要进入停车场时,检查停车场是否已满,如果未满则车辆进入停车场;如果停车场已满,则车辆进入便道等候。输出汽车在停车场内或便道上的停车位置;若车辆离去,则输出汽车在停车场内停留的时间和停车费(在便道上停留的时间不收费)。4.栈以顺序结构实现,队列以链表结构实现。
细化到每个函数的作用。。。概要设计、详细设计。。。。 展开
展开全部
2.3 停车场管理
2.3.1 项目简介
设停车场是一个可以停放n辆汽车的南北方向的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应缴纳的费用和它在停车场内停留的时间。
2.3.2 设计思路
停车场的管理流程如下:
①当车辆要进入停车场时,检查停车场是否已满,如果未满则车辆进入停车场;如果停车场已满,则车辆进入便道等候。
②当车辆要求出栈时,先让在它之后进入停车场的车辆退出停车场为它让路,再让该车退出停车场,让路的所有车辆再按其原来进入停车场的次序进入停车场。之后,再检查在便道上是否有车等候,有车则让最先等待的那辆车进入停车场。
2.3.3 数据结构
由于停车场只有一个大门,当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,先进停车场的后退出,后进车场的先退出,符合栈的“后进先出,先进后出”的操作特点,因此,可以用一个栈来模拟停车场。而当停车场满后,继续来到的其它车辆只能停在便道上,根据便道停车的特点,先排队的车辆先离开便道进入停车场,符合队列的“先进先出,后进后出”的操作特点,因此,可以用一个队列来模拟便道。排在停车场中间的车辆可以提出离开停车场,并且停车场内在要离开的车辆之后到达的车辆都必须先离开停车场为它让路,然后这些车辆依原来到达停车场的次序进入停车场,因此在前面已设的一个栈和一个队列的基础上,还需要有一个地方保存为了让路离开停车场的车辆,由于先退出停车场的后进入停车场,所以很显然保存让路车辆的场地也应该用一个栈来模拟。因此,本题求解过程中需用到两个栈和一个队列。栈以顺序结构实现,队列以链表结构实现。
2.3.4 程序清单
程序提示:以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
#include<stdio.h>
#include <stdlib.h>
#include<iostream.h>
#include<string.h>
#include<math.h>
#define size 1 //停车场位置数
//模拟停车场的堆栈的性质;
typedef struct zanlind{
int number; //汽车车号
int ar_time; //汽车到达时间
}zanInode;
typedef struct{
zanInode *base; //停车场的堆栈底
zanInode *top; //停车场的堆栈顶
int stacksize_curren;
}stackhead;
//堆栈的基本操作;
void initstack(stackhead &L) //构造一个空栈
{
L.base=(zanInode*)malloc(size*sizeof(zanlind));
if(!L.base) exit(0);
L.top=L.base;
L.stacksize_curren=0;
}
void push(stackhead &L,zanInode e) //把元素e压入s栈
{
*L.top++=e;
L.stacksize_curren++;
}
void pop(stackhead &L,zanInode &e) //把元素e弹出s栈
{
if(L.top==L.base)
{
cout<<"停车场为空 !!";
return;
}
e=*--L.top;
L.stacksize_curren--;
}
//模拟便道的队列的性质;
typedef struct duilie{
int number; //汽车车号
int ar_time; //汽车到达时间
struct duilie *next;
}*queueptr;
typedef struct{
queueptr front; //便道的队列的对头
queueptr rear; //便道的队列的队尾
int length;
}linkqueue;
//队列的基本操作;
void initqueue(linkqueue &q) //构造一个空队列
{
q.front=q.rear=(queueptr)malloc(sizeof(duilie));
if(!q.front||!q.rear)
exit(0);
q.front->next=NULL;
q.length=0;
}
void enqueue(linkqueue &q,int number,int ar_time) //把元素的插入队列(属性为number,ar_time)
{
queueptr p;
p=(queueptr)malloc(sizeof(duilie));
if(!p) exit(0);
p->number=number;
p->ar_time=ar_time;
p->next=NULL;
q.rear->next=p;
q.rear=p;
q.length++;
}
void popqueue(linkqueue &q,queueptr &w) //把元素的插入队列(属性为number,ar_time)
{
queueptr p;
if(q.front==q.rear)
{
cout<<"停车场的通道为空 ! !"<<endl;
return;
}
p=q.front->next;
w=p;
q.front->next=p->next;
q.length--;
if(q.rear==p) q.front=q.rear;
}
void jinru(stackhead &st,linkqueue &q) //对进入停车场的汽车的处理;
{
int number,time_a;
cout<<"车牌为:";
cin>>number;
cout<<"进场的时刻:";
cin>>time_a;
if(st.stacksize_curren<2)
{
zanInode e;
e.number=number;
e.ar_time=time_a;
push(st,e);
cout<< " 该车已进入停车场在: "<<st.stacksize_curren<<" 号车道"<<endl<<endl;
}
else
{
enqueue(q,number,time_a);
cout<<"停车场已满,该车先停在便道的第"<<q.length<<"个位置上"<<endl;
}
}
void likai(stackhead &st,stackhead &sl,linkqueue &q) //对离开的汽车的处理;
{ //st堆栈为停车场,sl堆栈为倒车场
int number,time_d,flag=1,money,arrivaltime; //q为便道队列
cout<<"车牌为:";
cin>>number;
cout<<"出场的时刻:";
cin>>time_d;
zanInode e,q_to_s;
queueptr w;
while(flag) //找到要开出的车,并弹出停车场栈
{
pop(st,e);
push(sl,e);
if(e.number==number)
{
flag=0;
money=(time_d-e.ar_time)*2;
arrivaltime=e.ar_time;
}
}
pop(sl,e); //把临时堆栈的第一辆车(要离开的)去掉;
while(sl.stacksize_curren) //把倒车场的车倒回停车场
{
pop(sl,e);
push(st,e);
}
if(st.stacksize_curren<2&&q.length!=0) //停车场有空位,便道上的车开进入停车场
{
popqueue(q,w);
q_to_s.ar_time=time_d;
q_to_s.number=w->number;
push(st,q_to_s);
cout<<"车牌为"<<q_to_s.number<<"的车已从通道进入停车场,所在的停车位为:"<<st.stacksize_curren<<endl<<endl;
}
cout<<"\n 收 据"<<endl;
cout<<" ====================== 车牌号: "<<number<<endl;
cout<<"==================================================="<<endl;
cout<<"|进车场时刻 | 出车场时刻 | 停留时间 | 应付(元)|"<<endl;
cout<<"===================================================="<<endl;
cout<<"| "<<arrivaltime<<" | "<<time_d<<" | "<<time_d-arrivaltime<<" | "<<money<<" |"<<endl;
cout<<"-----------------------------------------------------"<<endl<<endl;
}
void main()
{
int m=100;
char flag; //进入或离开的标识;
stackhead sting,slinshi; //停车场和临时倒车场堆栈的定义;
linkqueue line; //队列的定义;
initstack(sting); //构造停车场堆栈sting
initstack(slinshi); //构造倒车场堆栈slinshi
initqueue(line); //构造便道队列line
while(m)
{
cout<<"\n ** 停车场管理程序 **"<<endl;
cout<<"==================================================="<<endl;
cout<<"** **"<<endl;
cout<<"** A --- 汽车 进 车场 D --- 汽车 出 车场 **"<<endl;
cout<<"** **"<<endl;
cout<<"** E --- 退出 程序 **"<<endl;
cout<<"==================================================="<<endl;
cout<<" 请选择 :(A,D,E): ";
cin>>flag;
switch(flag)
{
case 'A': jinru(sting,line);break; //汽车进车场
case 'D': likai(sting,slinshi,line);break; //汽车出车场
case 'E': exit(0);
}
m--;
}
}
2.3.5 运行结果
2.3.1 项目简介
设停车场是一个可以停放n辆汽车的南北方向的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应缴纳的费用和它在停车场内停留的时间。
2.3.2 设计思路
停车场的管理流程如下:
①当车辆要进入停车场时,检查停车场是否已满,如果未满则车辆进入停车场;如果停车场已满,则车辆进入便道等候。
②当车辆要求出栈时,先让在它之后进入停车场的车辆退出停车场为它让路,再让该车退出停车场,让路的所有车辆再按其原来进入停车场的次序进入停车场。之后,再检查在便道上是否有车等候,有车则让最先等待的那辆车进入停车场。
2.3.3 数据结构
由于停车场只有一个大门,当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,先进停车场的后退出,后进车场的先退出,符合栈的“后进先出,先进后出”的操作特点,因此,可以用一个栈来模拟停车场。而当停车场满后,继续来到的其它车辆只能停在便道上,根据便道停车的特点,先排队的车辆先离开便道进入停车场,符合队列的“先进先出,后进后出”的操作特点,因此,可以用一个队列来模拟便道。排在停车场中间的车辆可以提出离开停车场,并且停车场内在要离开的车辆之后到达的车辆都必须先离开停车场为它让路,然后这些车辆依原来到达停车场的次序进入停车场,因此在前面已设的一个栈和一个队列的基础上,还需要有一个地方保存为了让路离开停车场的车辆,由于先退出停车场的后进入停车场,所以很显然保存让路车辆的场地也应该用一个栈来模拟。因此,本题求解过程中需用到两个栈和一个队列。栈以顺序结构实现,队列以链表结构实现。
2.3.4 程序清单
程序提示:以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
#include<stdio.h>
#include <stdlib.h>
#include<iostream.h>
#include<string.h>
#include<math.h>
#define size 1 //停车场位置数
//模拟停车场的堆栈的性质;
typedef struct zanlind{
int number; //汽车车号
int ar_time; //汽车到达时间
}zanInode;
typedef struct{
zanInode *base; //停车场的堆栈底
zanInode *top; //停车场的堆栈顶
int stacksize_curren;
}stackhead;
//堆栈的基本操作;
void initstack(stackhead &L) //构造一个空栈
{
L.base=(zanInode*)malloc(size*sizeof(zanlind));
if(!L.base) exit(0);
L.top=L.base;
L.stacksize_curren=0;
}
void push(stackhead &L,zanInode e) //把元素e压入s栈
{
*L.top++=e;
L.stacksize_curren++;
}
void pop(stackhead &L,zanInode &e) //把元素e弹出s栈
{
if(L.top==L.base)
{
cout<<"停车场为空 !!";
return;
}
e=*--L.top;
L.stacksize_curren--;
}
//模拟便道的队列的性质;
typedef struct duilie{
int number; //汽车车号
int ar_time; //汽车到达时间
struct duilie *next;
}*queueptr;
typedef struct{
queueptr front; //便道的队列的对头
queueptr rear; //便道的队列的队尾
int length;
}linkqueue;
//队列的基本操作;
void initqueue(linkqueue &q) //构造一个空队列
{
q.front=q.rear=(queueptr)malloc(sizeof(duilie));
if(!q.front||!q.rear)
exit(0);
q.front->next=NULL;
q.length=0;
}
void enqueue(linkqueue &q,int number,int ar_time) //把元素的插入队列(属性为number,ar_time)
{
queueptr p;
p=(queueptr)malloc(sizeof(duilie));
if(!p) exit(0);
p->number=number;
p->ar_time=ar_time;
p->next=NULL;
q.rear->next=p;
q.rear=p;
q.length++;
}
void popqueue(linkqueue &q,queueptr &w) //把元素的插入队列(属性为number,ar_time)
{
queueptr p;
if(q.front==q.rear)
{
cout<<"停车场的通道为空 ! !"<<endl;
return;
}
p=q.front->next;
w=p;
q.front->next=p->next;
q.length--;
if(q.rear==p) q.front=q.rear;
}
void jinru(stackhead &st,linkqueue &q) //对进入停车场的汽车的处理;
{
int number,time_a;
cout<<"车牌为:";
cin>>number;
cout<<"进场的时刻:";
cin>>time_a;
if(st.stacksize_curren<2)
{
zanInode e;
e.number=number;
e.ar_time=time_a;
push(st,e);
cout<< " 该车已进入停车场在: "<<st.stacksize_curren<<" 号车道"<<endl<<endl;
}
else
{
enqueue(q,number,time_a);
cout<<"停车场已满,该车先停在便道的第"<<q.length<<"个位置上"<<endl;
}
}
void likai(stackhead &st,stackhead &sl,linkqueue &q) //对离开的汽车的处理;
{ //st堆栈为停车场,sl堆栈为倒车场
int number,time_d,flag=1,money,arrivaltime; //q为便道队列
cout<<"车牌为:";
cin>>number;
cout<<"出场的时刻:";
cin>>time_d;
zanInode e,q_to_s;
queueptr w;
while(flag) //找到要开出的车,并弹出停车场栈
{
pop(st,e);
push(sl,e);
if(e.number==number)
{
flag=0;
money=(time_d-e.ar_time)*2;
arrivaltime=e.ar_time;
}
}
pop(sl,e); //把临时堆栈的第一辆车(要离开的)去掉;
while(sl.stacksize_curren) //把倒车场的车倒回停车场
{
pop(sl,e);
push(st,e);
}
if(st.stacksize_curren<2&&q.length!=0) //停车场有空位,便道上的车开进入停车场
{
popqueue(q,w);
q_to_s.ar_time=time_d;
q_to_s.number=w->number;
push(st,q_to_s);
cout<<"车牌为"<<q_to_s.number<<"的车已从通道进入停车场,所在的停车位为:"<<st.stacksize_curren<<endl<<endl;
}
cout<<"\n 收 据"<<endl;
cout<<" ====================== 车牌号: "<<number<<endl;
cout<<"==================================================="<<endl;
cout<<"|进车场时刻 | 出车场时刻 | 停留时间 | 应付(元)|"<<endl;
cout<<"===================================================="<<endl;
cout<<"| "<<arrivaltime<<" | "<<time_d<<" | "<<time_d-arrivaltime<<" | "<<money<<" |"<<endl;
cout<<"-----------------------------------------------------"<<endl<<endl;
}
void main()
{
int m=100;
char flag; //进入或离开的标识;
stackhead sting,slinshi; //停车场和临时倒车场堆栈的定义;
linkqueue line; //队列的定义;
initstack(sting); //构造停车场堆栈sting
initstack(slinshi); //构造倒车场堆栈slinshi
initqueue(line); //构造便道队列line
while(m)
{
cout<<"\n ** 停车场管理程序 **"<<endl;
cout<<"==================================================="<<endl;
cout<<"** **"<<endl;
cout<<"** A --- 汽车 进 车场 D --- 汽车 出 车场 **"<<endl;
cout<<"** **"<<endl;
cout<<"** E --- 退出 程序 **"<<endl;
cout<<"==================================================="<<endl;
cout<<" 请选择 :(A,D,E): ";
cin>>flag;
switch(flag)
{
case 'A': jinru(sting,line);break; //汽车进车场
case 'D': likai(sting,slinshi,line);break; //汽车出车场
case 'E': exit(0);
}
m--;
}
}
2.3.5 运行结果
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |