问题描述
设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次有北向南排列(大门在最南端,最先到达的第一车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。
算法思想
题目需要用到的知识就是出栈入栈和出队入队的模拟。需要两个栈和一个队列,一个栈AS用来储存停车场内车的信息,另一个栈BS为临时栈,用来储存前面车要离开,后面的退出等待的车的信息。队列储存便道的车。停车操作时,若AS不满可以直接存入,并从键盘输入停车时间,记录停车位置;AS满了之后,车辆进入队列CQ,记录停车位置。取车操作时,所取车后面的车辆先进入BS,然后删去AS中要取的车,BS中的车入AS栈,便道的车辆也随其后进入AS。
算法设计
1、菜单显示void menu()——供用户选择的功能菜单。
2、输出停车场信息void Indisplay(CarStack AS)——若停车场暂无停车信息,则给出提示;否则输出停车位置、车牌号和停车时间。
3、输出便道信息void Outdisplay(CarQueue CQ)——若便道暂无车辆等候,则给出提示;否则输出停车位置和车牌号。
4、栈与队列的初始化Status Init(CarStack &AS,CarStack &BS,CarQueue &CQ)——为AS、BS分配空间,对AS、BS、CQ初始化。
5、停入便道Status Pushroad(CarQueue &CQ)——记录车辆的车牌号,便道车辆总数加1,此时的车辆总数也即为该车辆在便道的位置。
6、进入临时栈Status Inbs(CarStack &AS,CarStack &BS,int a)——用一层for循环解决元素从AS出栈,进入BS。
7、出临时栈Status Outbs(CarStack &AS,CarStack &BS)——用一层for循环解决元素从BS出栈,进入AS。
8、便道车进入停车场Status Qtos(CarStack &AS,CarStack &BS,CarQueue &CQ)——当CQ不空,AS不满的情况下,便道车进入停车场,从键盘输入停车时间,便道车辆总数减一,停车场总数加1,停车场当前总数即为所入车辆的位置。
9、进入停车场Status Pushstack(CarStack &AS,CarStack &BS,CarQueue &CQ)——当停车场不满时,记录车辆的车牌号和到达时间,停车场车辆总数加1,此时的车辆总数也即为该车辆在便道的位置。
10、出停车场Status Popstack(CarStack &AS,CarStack &BS,CarQueue &CQ)——当停车场不为空时,从键盘输入所取车的位置,后面在停车场的车进入BS临时栈,要离开的车出停车场,从键盘输入车辆离开时间,,停车场车辆总数减一;计算应交费用,若到达时间要晚于离开时间,则按该车第二天离开计算,每秒为0.1元;在AS不满的前提下,BS入栈,CQ中元素也入栈。
11、主函数int main()——先调用初始化函数,然后用while循环实现不断地对功能进行选择。
代码实现
#include<stdio.h>
#include<algorithm>
typedef int Status;
#define OK 1
#define ERROR 0
#define price 0.1
#define Max 3
typedef struct{
int hour;
int minute;
}Time;//时间
typedef struct{
char num[15];
Time leave;
Time arrive;
}CarData;//车辆信息
typedef struct {
CarData *base;//指针所指向的类型为CarData
CarData *top;
int stacksize;
}CarStack;
typedef struct Node{
CarData data;
struct Node *next;
}QueueNode,*node;
typedef struct{
QueueNode *fron;
QueueNode *rear;
}CarQueue;
int rnum=0,snum=0;
void menu(){//菜单显示
printf("**************欢迎来到停车场信息系统**************\n");
printf(" 1、停车场车辆到达操作\n");
printf(" 2、停车场车辆离开操作\n");
printf(" 3、停车场全部车辆信息\n");
printf(" 4、便道全部车辆信息\n");
printf(" 5、退出系统\n");
printf("**************************************************\n");
printf("请选择...\n");
}
void Indisplay(CarStack AS){//输出停车场信息
if(AS.base==AS.top){
printf("停车场暂无停车信息\n");
return;
}
int i=snum;
while(AS.base!=AS.top){
printf("第%d个位置车辆信息:\n",i);
printf("车牌号:%s\n",(AS.top-1)->num);
printf("到达时间:%d:%d\n\n",(AS.top-1)->arrive.hour,(AS.top-1)->arrive.minute);
AS.top--;
i--;
}
}
void Outdisplay(CarQueue CQ){//输出便道信息
if(CQ.fron==CQ.rear)
{
printf("便道暂无车辆等候!\n");
return;
}
int i=1;
node p;
while(CQ.fron!=CQ.rear)
{
printf("便道上第%d个位置上的车辆信息:\n",i);
p=CQ.fron->next;
printf("车牌号:%s\n",p->data.num);
if(CQ.rear==p)//出错
CQ.rear=CQ.fron;
else
{
CQ.fron->next=p->next;//指针错误
i++;
}
}
}
Status Init(CarStack &AS,CarStack &BS,CarQueue &CQ){//栈与队列的初始化
AS.base=new CarData[Max+1];
BS.base=new CarData[Max+1];//临时栈
AS.top=AS.base;
BS.top=BS.base;
AS.stacksize=Max;
BS.stacksize=Max;
CQ.fron=CQ.rear=new QueueNode;
CQ.fron->next=NULL;
return OK;
}
Status Pushroad(CarQueue &CQ){//停入便道
node p;
p=new QueueNode;
printf("请输入到达车辆的车牌号:");
scanf("%s",p->data.num);
printf("\n");
rnum++;
printf("**************车辆停入便道成功!**************\n当前车辆停在便道第%d个位置\n\n\n",rnum);
p->next=NULL;
CQ.rear->next=p;
CQ.rear=p;
return OK;
}
Status Inbs(CarStack &AS,CarStack &BS,int a){//进入临时栈
if(a<snum)
for(int i=1;i<=snum-a;i++)
{
*BS.top++=*--AS.top;
}
return OK;
}
Status Outbs(CarStack &AS,CarStack &BS)//出临时栈
{
if(BS.base!=BS.top){
while(BS.base!=BS.top){
*AS.top++=*--BS.top;
}
}
return OK;
}
Status Qtos(CarStack &AS,CarStack &BS,CarQueue &CQ){//便道车进入停车场
if(CQ.fron!=CQ.rear){
node p;
printf("\n\n便道车辆停入停车场...\n");
while(CQ.fron!=CQ.rear&&AS.top-AS.base!=AS.stacksize){
p=CQ.fron->next;
printf("请输入车辆到达的时间,时(0-23)与分(0-59),中间用空格隔开:");
scanf("%d%d",&p->data.arrive.hour,&p->data.arrive.minute);
printf("\n");
snum++;
rnum--;
printf("**************车辆停入停车场成功!**************\n当前车辆停在第%d个位置\n",snum);
printf("车辆车牌号为:%s\n\n\n",p->data.num);
*AS.top++=p->data;
if(CQ.rear==p)
CQ.rear=CQ.fron;
else
CQ.fron->next=p->next;
return OK;
}
}
else
return ERROR;
return ERROR;
}
Status Pushstack(CarStack &AS,CarStack &BS,CarQueue &CQ){//进入停车场
if(AS.top-AS.base==AS.stacksize)
{
printf("***********停车场已满,后续车辆需在便道等候!***********\n\n");
Pushroad(CQ);
}
else
{
printf("请输入到达车辆的车牌号:");
scanf("%s",AS.top->num);
printf("请输入车辆到达的时间,时(0-23)与分(0-59),中间用空格隔开:");
scanf("%d%d",&AS.top->arrive.hour,&AS.top->arrive.minute);
printf("\n\n");
snum++;
AS.top++;
printf("**************车辆停入停车场成功!**************\n当前车辆停在第%d个位置\n\n\n",snum);
}
return OK;
}
Status Popstack(CarStack &AS,CarStack &BS,CarQueue &CQ){//出栈
if(AS.base==AS.top)
{
printf("停车场暂无停车信息\n");
return ERROR;
}
printf("请输入所取车的位置:");
int a;
scanf("%d",&a);
Inbs(AS,BS,a);//进入临时栈
if(a>snum)
{
printf("\n该位置无车辆存放!\n\n");
return ERROR;
}
printf("请输入车辆离开的时间,时(0-23)与分(0-59),中间用空格隔开:");
--AS.top;
snum--;
scanf("%d%d",&AS.top->leave.hour,&AS.top->leave.minute);
printf("车辆的编号:%s\n",AS.top->num);
printf("车辆的到达时间:%d:%d\n",AS.top->arrive.hour,AS.top->arrive.minute);
printf("车辆的离开时间:%d:%d\n",AS.top->leave.hour,AS.top->leave.minute);
float money;
if(AS.top->arrive.hour>AS.top->leave.hour||
(AS.top->arrive.hour==AS.top->leave.hour&&AS.top->arrive.minute>AS.top->leave.minute))
money=((23 - AS.top->arrive.hour +AS.top->leave.hour) * 60 +
(60 - AS.top->arrive.minute +AS.top->leave.minute))*price;
else
money=((AS.top->leave.hour-AS.top->arrive.hour)*60+(AS.top->leave.minute-AS.top->arrive.minute))
*price;
printf("车辆需交费用为:%.2f\n",money);
Outbs(AS,BS);//临时栈车入场
Qtos(AS,BS,CQ);//便道车入场
return OK;
}
int main(){
CarStack AS,BS;
CarQueue CQ;//便道
Init(AS,BS,CQ);
int m=0;
while(m!=5){
menu();
scanf("%d",&m);
switch(m){
case 1:
Pushstack(AS,BS,CQ);
break;
case 2:
Popstack(AS,BS,CQ);
break;
case 3:
Indisplay(AS);
break;
case 4:
Outdisplay(CQ);
break;
case 5:
printf("感谢您的使用!\n");
return 0;
default:
printf("没有该选项!\n");
}
system("pause");
system("cls");
}
return 0;
}