分类:
2008-09-17 11:11:25
问题描述
设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已经停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出场为它让路,待该辆车开出大门外,其他车辆再按次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用,试为停车场编制按上述要求进行管理的模拟程序。
基本要求
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现。队列以链表结构实现。
测试数据
设n=2,输入数据为:(‘A’,1,5), (‘A’,2,10), (‘D’,1,5), (‘A’,3,20), (‘A’,4,25), (‘A’,5,30), (‘D’,2,35), (‘D’,4,40), (‘E’,0,0)。其中:‘A’表示到达(Arrival),‘D’表示离去(Departure),‘E’表示输入结束(End)。
实现提示
需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。
下面是我编写的程序,不知道哪里的问题,望高人指点改下,谢谢!
#include
#include
struct parking//停车场内车辆信息
{
int num,time,turn;//车牌号,时间,停放顺序;
};
struct road//路上车辆信息
{
int plat,rtime;//车牌号
struct road *next;
};
void main()
{
int n,/*能停的车数*/i=1,/*车在停车场的位置*/j,/*暂存车号*/k,/*暂存出车时间*/one=sizeof(struct parking)/*一个车辆信息所占字节数*/;
char inf/*汽车"到达"或"离去"信息*/;
struct parking *SI;//停车场栈顶
struct parking *SP;//停车场栈底
struct parking *last;//停车场最后一辆车地址
struct parking *pausep1;
struct parking *pausep2;
struct parking *BP;//暂存推出车辆的新栈栈底
struct parking *PI;//暂存推出车辆的新栈栈顶
struct road *head;//队列头节点
struct road *rcar;//路上车辆
struct road *pauser;
head=(struct road*)malloc(sizeof(struct road));
head=NULL;
printf("请输入车场能停的最大车辆数:\n");
scanf("%d",&n);
SI=(struct parking*)malloc(n*sizeof(struct parking));//停车场
PI=(struct parking*)malloc(n*sizeof(struct parking));//存放退出的汽车
SI-=one;
SP=SI;
last=SP+n*sizeof(struct parking);
PI-=one;
BP=PI;
exe:printf("请输入汽车《到达》或《离去》信息('A'表示到达(Arrival),'D'表示离去(Departure),'E'表示输入结束(End))、汽车牌照号码以及到达或离去的时刻:\n");
scanf("%c",&inf);
if(inf!='E')
{
if(inf=='A')
{
if(SI=last)//停车场已满
{
printf("停车场已满,请在外面排队\n");
rcar=head;
for(;rcar!=NULL;)
{
rcar=rcar->next;
}
rcar->next=(struct road*)malloc(sizeof(struct road));
rcar=rcar->next;
rcar->next=NULL;
scanf("%d",&(rcar->plat));
scanf("%d",&(rcar->rtime));
if(head==NULL)
{
head=rcar;
}
}
else
{
SI+=one;
scanf("%d",&(SI->num));
scanf("%d",&(SI->time));
SI->turn=i;
i++;
printf("该车现在被停在车场内%d号位",i);
}
}
else if(inf=='D')
{
scanf("%d",&j);
scanf("%d",&k);
if(SI==SP)
{
printf("停车场内没有车\n");
goto exe;
}
else
{
pausep1=SI;
for(;SI!=SP;SI-=one)
{
if(SI->num==j)
{
printf("车在停车场内\n");
pausep2=SI;
printf("车号为%d的车%d点进停车场%d点出停车场在%d号位\n",SI->num,SI->time,k,SI->turn);
for(PI=BP,SI=pausep1;SI!=pausep2;SI-=one)//别的车出栈
{
PI+=one;
PI->num=SI->num;
PI->time=SI->time;
PI->turn=SI->turn;
}
for(SI=pausep2;PI!=BP;PI-=one,SI+=one)
{
SI->num=PI->num;
SI->time=PI->time;
SI->turn=PI->turn;
SI->turn-=1;
}
SI-=one;
if(head->next!=NULL)
{
SI+=one;
SI->num=(head->next)->plat;
SI->turn=n;
SI->time=k;
printf("在路上等待的第一辆车车牌号为%d的车辆已进入车场,进入时间%d点",SI->num,SI->time);
head->next=(head->next)->next;
}
goto exe;
}
for(rcar=head->next;rcar!=NULL;pauser=rcar,rcar=rcar->next)//停车场没有此车,查路上
{
if(rcar->plat==j)
{
printf("此车在路上停放,不用缴费");
if((head->next)->plat==j)
{
head->next=(head->next)->next;
}
else
rcar=pauser;
rcar->next=(rcar->next)->next;
goto exe;
}
}
printf("此车不在附近");
goto exe;
}
}
}
else//输入了别的字母
printf("请输入正确汽车《到达》或《离去》信息('A'表示到达(Arrival),'D'表示离去(Departure),'E'表示输入结束(End))");
goto exe;
}
}
__________________
谢谢大家的指点!