【要求C或C++编程】
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在停车场的最北端),若停车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。
【基本要求】
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。
完整的实现代码如下:
第一种方法:
- #include "stdio.h"
- #include "stdlib.h"
- #include "string.h"
- #define MAX 2 //车库容量
- #define price 0.05 //每车每分钟费用
- typedef struct time //时间结点
- {
- int hour;
- int min;
- }Time;
- typedef struct node //车辆信息结点
- {
- char num[10];
- Time reach;
- Time leave;
- }CarNode;
- typedef struct NODE //模拟车站
- {
- CarNode *stack[MAX+1];
- int top;
- }SeqStackCar;
- typedef struct car
- {
- CarNode *data;
- struct car *next;
- }QueueNode;
- typedef struct Node //模拟通道
- {
- QueueNode *head;
- QueueNode *rear;
- }LinkQueueCar;
- void InitStack(SeqStackCar *); //初始化栈
- int InitQueue(LinkQueueCar *); //初始化便道
- int arrival(SeqStackCar *,LinkQueueCar *); //车辆到达
- void leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *); //车辆离开
- void list(SeqStackCar,LinkQueueCar); //显示存车信息
- int main(void)
- {
- SeqStackCar Enter,Temp;
- LinkQueueCar Wait;
- int ch;
- InitStack(&Enter); //初始化车站
- InitStack(&Temp); //初始化让路的临时栈
- InitQueue(&Wait); //初始化通道
- while(1)
- {
- printf("\n 1. The car arrive\n");
- printf(" 2. The car leave\n");
- printf(" 3. The schedule\n");
- printf(" 4. Exit\n");
- while(1)
- {
- scanf("%d",&ch);
- if(ch>=1 && ch<=4)
- break;
- else
- printf("\nPlease choose: 1|2|3|4.");
- }
- switch(ch)
- {
- case 1:
- arrival(&Enter,&Wait); //车辆到达
- break;
- case 2:
- leave(&Enter,&Temp,&Wait); //车辆离开
- break;
- case 3:
- list(Enter,Wait);break; //列表打印信息
- case 4:
- exit(0); //退出主程序
- default:
- break;
- }
- }
- }
- void InitStack(SeqStackCar *s) //初始化栈
- {
- int i;
- s->top=0;
- for(i=0;i<=MAX;i++)
- s->stack[s->top]=NULL;
- }
- int InitQueue(LinkQueueCar *Q) //初始化便道
- {
- Q->head=(QueueNode *)malloc(sizeof(QueueNode));
- if(Q->head!=NULL)
- {
- Q->head->next=NULL;
- Q->rear=Q->head;
- return 1;
- }
- else return -1;
- }
- void print(CarNode *p,int room) //打印出站车的信息
- {
- int A1,A2,B1,B2;
- printf("\nplease input thedepart time:/**:**/");
- scanf("%d:%d",&(p->leave.hour),&(p->leave.min));
- printf("\nthe number of the car:");
- puts(p->num);
- printf("\nthe time the car arrive: %d:%d",p->reach.hour,p->reach.min);
- printf("the depart time: %d:%d",p->leave.hour,p->leave.min);
- A1=p->reach.hour;
- A2=p->reach.min;
- B1=p->leave.hour;
- B2=p->leave.min;
- printf("\nthe fee: %2.1f元",((B1-A1)*60+(B2-A2))*price);
- free(p);
- }
- int arrival(SeqStackCar *Enter,LinkQueueCar *W) //车辆到达
- {
- CarNode *p;
- QueueNode *t;
- p=(CarNode *)malloc(sizeof(CarNode));
- flushall();
- printf("\ninput the number of the car(例:陕A1234):");
- gets(p->num);
- if(Enter->top<MAX) //车场未满,车进车场
- {
- Enter->top++;
- printf("\nthe place of the car.",Enter->top);
- printf("\nthe time thecar arrive:/**:**/");
- scanf("%d:%d",&(p->reach.hour),&(p->reach.min));
- Enter->stack[Enter->top]=p;
- return 1;
- }
- else //车场已满,车进便道
- {
- printf("\n该车须在便道等待!");
- t=(QueueNode *)malloc(sizeof(QueueNode));
- t->data=p;
- t->next=NULL;
- W->rear->next=t;
- W->rear=t;
- return 1;
- }
- }
- void leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W) //车辆离开
- {
- int i, room;
- CarNode *p,*t;
- QueueNode *q;
- //判断车场内是否有车
- if(Enter->top>0) //有车
- {
- while(1) //输入离开车辆的信息
- {
- printf("\n请输入车在车场的位置/1--%d/:",Enter->top);
- scanf("%d",&room);
- if(room>=1&&room<=Enter->top)
- break;
- }
- while(Enter->top>room) //车辆离开
- {
- Temp->top++;
- Temp->stack[Temp->top]=Enter->stack[Enter->top];
- Enter->stack[Enter->top]=NULL;
- Enter->top--;
- }
- p=Enter->stack[Enter->top];
- Enter->stack[Enter->top]=NULL;
- Enter->top--;
- while(Temp->top>=1)
- {
- Enter->top++;
- Enter->stack[Enter->top]=Temp->stack[Temp->top];
- Temp->stack[Temp->top]=NULL;
- Temp->top--;
- }
- print(p,room);
- //判断通道上是否有车及车站是否已满
- if((W->head!=W->rear)&&Enter->top<MAX) //便道的车辆进入车场
- {
- q=W->head->next;
- t=q->data;
- Enter->top++;
- printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);
- printf("\n请输入现在的时间/**:**/:");
- scanf("%d:%d",&(t->reach.hour),&(t->reach.min));
- W->head->next=q->next;
- if(q==W->rear) W->rear=W->head;
- Enter->stack[Enter->top]=t;
- free(q);
- }
- else
- printf("\n便道里没有车.\n");
- }
- else
- printf("\n车场里没有车."); //没车
- }
- void list1(SeqStackCar *S) //列表显示车场信息
- {
- int i;
- if(S->top>0) //判断车站内是否有车
- {
- printf("\n车场:");
- printf("\n 位置 到达时间 车牌号\n");
- for(i=1;i<=S->top;i++)
- {
- printf(" %d ",i);
- printf("%d:%d ",S->stack[i]->reach.hour,S->stack[i]->reach.min);
- puts(S->stack[i]->num);
- }
- }
- else
- printf("\n车场里没有车");
- }
- void list2(LinkQueueCar *W) //列表显示便道信息
- {
- QueueNode *p;
- p=W->head->next;
- if(W->head!=W->rear) //判断通道上是否有车
- {
- printf("\n等待车辆的号码为:");
- while(p!=NULL)
- {
- puts(p->data->num);
- p=p->next;
- }
- }
- else
- printf("\n便道里没有车.");
- }
- void list(SeqStackCar S,LinkQueueCar W)
- {
- int flag,tag;
- flag=1;
- while(flag)
- {
- printf("\n请选择 1|2|3:");
- printf("\n1.车场\n2.便道\n3.返回\n");
- while(1)
- {
- scanf("%d",&tag);
- if(tag>=1 || tag<=3)
- break;
- else
- printf("\n请选择 1|2|3:");
- }
- switch(tag)
- {
- case 1:
- list1(&S);
- break; //列表显示车场信息
- case 2:
- list2(&W);
- break; //列表显示便道信息
- case 3:
- flag=0;
- break;
- default: break;
- }
- }
- }
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define MAX 2 //车库容量
#define price 0.05 //每车每分钟费用
typedef struct time //时间结点
{
int hour;
int min;
}Time;
typedef struct node //车辆信息结点
{
char num[10];
Time reach;
Time leave;
}CarNode;
typedef struct NODE //模拟车站
{
CarNode *stack[MAX+1];
int top;
}SeqStackCar;
typedef struct car
{
CarNode *data;
struct car *next;
}QueueNode;
typedef struct Node //模拟通道
{
QueueNode *head;
QueueNode *rear;
}LinkQueueCar;
void InitStack(SeqStackCar *); //初始化栈
int InitQueue(LinkQueueCar *); //初始化便道
int arrival(SeqStackCar *,LinkQueueCar *); //车辆到达
void leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *); //车辆离开
void list(SeqStackCar,LinkQueueCar); //显示存车信息
int main(void)
{
SeqStackCar Enter,Temp;
LinkQueueCar Wait;
int ch;
InitStack(&Enter); //初始化车站
InitStack(&Temp); //初始化让路的临时栈
InitQueue(&Wait); //初始化通道
while(1)
{
printf("\n 1. The car arrive\n");
printf(" 2. The car leave\n");
printf(" 3. The schedule\n");
printf(" 4. Exit\n");
while(1)
{
scanf("%d",&ch);
if(ch>=1 && ch<=4)
break;
else
printf("\nPlease choose: 1|2|3|4.");
}
switch(ch)
{
case 1:
arrival(&Enter,&Wait); //车辆到达
break;
case 2:
leave(&Enter,&Temp,&Wait); //车辆离开
break;
case 3:
list(Enter,Wait);break; //列表打印信息
case 4:
exit(0); //退出主程序
default:
break;
}
}
}
void InitStack(SeqStackCar *s) //初始化栈
{
int i;
s->top=0;
for(i=0;i<=MAX;i++)
s->stack[s->top]=NULL;
}
int InitQueue(LinkQueueCar *Q) //初始化便道
{
Q->head=(QueueNode *)malloc(sizeof(QueueNode));
if(Q->head!=NULL)
{
Q->head->next=NULL;
Q->rear=Q->head;
return 1;
}
else return -1;
}
void print(CarNode *p,int room) //打印出站车的信息
{
int A1,A2,B1,B2;
printf("\nplease input thedepart time:/**:**/");
scanf("%d:%d",&(p->leave.hour),&(p->leave.min));
printf("\nthe number of the car:");
puts(p->num);
printf("\nthe time the car arrive: %d:%d",p->reach.hour,p->reach.min);
printf("the depart time: %d:%d",p->leave.hour,p->leave.min);
A1=p->reach.hour;
A2=p->reach.min;
B1=p->leave.hour;
B2=p->leave.min;
printf("\nthe fee: %2.1f元",((B1-A1)*60+(B2-A2))*price);
free(p);
}
int arrival(SeqStackCar *Enter,LinkQueueCar *W) //车辆到达
{
CarNode *p;
QueueNode *t;
p=(CarNode *)malloc(sizeof(CarNode));
flushall();
printf("\ninput the number of the car(例:陕A1234):");
gets(p->num);
if(Enter->top<MAX) //车场未满,车进车场
{
Enter->top++;
printf("\nthe place of the car.",Enter->top);
printf("\nthe time thecar arrive:/**:**/");
scanf("%d:%d",&(p->reach.hour),&(p->reach.min));
Enter->stack[Enter->top]=p;
return 1;
}
else //车场已满,车进便道
{
printf("\n该车须在便道等待!");
t=(QueueNode *)malloc(sizeof(QueueNode));
t->data=p;
t->next=NULL;
W->rear->next=t;
W->rear=t;
return 1;
}
}
void leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W) //车辆离开
{
int i, room;
CarNode *p,*t;
QueueNode *q;
//判断车场内是否有车
if(Enter->top>0) //有车
{
while(1) //输入离开车辆的信息
{
printf("\n请输入车在车场的位置/1--%d/:",Enter->top);
scanf("%d",&room);
if(room>=1&&room<=Enter->top)
break;
}
while(Enter->top>room) //车辆离开
{
Temp->top++;
Temp->stack[Temp->top]=Enter->stack[Enter->top];
Enter->stack[Enter->top]=NULL;
Enter->top--;
}
p=Enter->stack[Enter->top];
Enter->stack[Enter->top]=NULL;
Enter->top--;
while(Temp->top>=1)
{
Enter->top++;
Enter->stack[Enter->top]=Temp->stack[Temp->top];
Temp->stack[Temp->top]=NULL;
Temp->top--;
}
print(p,room);
//判断通道上是否有车及车站是否已满
if((W->head!=W->rear)&&Enter->top<MAX) //便道的车辆进入车场
{
q=W->head->next;
t=q->data;
Enter->top++;
printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);
printf("\n请输入现在的时间/**:**/:");
scanf("%d:%d",&(t->reach.hour),&(t->reach.min));
W->head->next=q->next;
if(q==W->rear) W->rear=W->head;
Enter->stack[Enter->top]=t;
free(q);
}
else
printf("\n便道里没有车.\n");
}
else
printf("\n车场里没有车."); //没车
}
void list1(SeqStackCar *S) //列表显示车场信息
{
int i;
if(S->top>0) //判断车站内是否有车
{
printf("\n车场:");
printf("\n 位置 到达时间 车牌号\n");
for(i=1;i<=S->top;i++)
{
printf(" %d ",i);
printf("%d:%d ",S->stack[i]->reach.hour,S->stack[i]->reach.min);
puts(S->stack[i]->num);
}
}
else
printf("\n车场里没有车");
}
void list2(LinkQueueCar *W) //列表显示便道信息
{
QueueNode *p;
p=W->head->next;
if(W->head!=W->rear) //判断通道上是否有车
{
printf("\n等待车辆的号码为:");
while(p!=NULL)
{
puts(p->data->num);
p=p->next;
}
}
else
printf("\n便道里没有车.");
}
void list(SeqStackCar S,LinkQueueCar W)
{
int flag,tag;
flag=1;
while(flag)
{
printf("\n请选择 1|2|3:");
printf("\n1.车场\n2.便道\n3.返回\n");
while(1)
{
scanf("%d",&tag);
if(tag>=1 || tag<=3)
break;
else
printf("\n请选择 1|2|3:");
}
switch(tag)
{
case 1:
list1(&S);
break; //列表显示车场信息
case 2:
list2(&W);
break; //列表显示便道信息
case 3:
flag=0;
break;
default: break;
}
}
}
第二种方法:
- #include "stdio.h"
- #include "stdlib.h"
- #define SIZE 10
- typedef struct
- {
- int hour;
- int min;
- }time; //车的时间结构体
- typedef struct
- {
- int num;
- int position;
- time t;
- float money;
- }Car; //车的信息
- typedef struct
- {
- Car elem[SIZE+1];
- int top; //指向便道中的第一个空位
- } Stack; //创建堆栈
- typedef struct Node
- {
- Car data;
- struct Node *next;
- }CQueueNode;
- //建立过道的程序:
- typedef struct
- {
- CQueueNode *front;
- CQueueNode *rear;
- }LinkQueue; //设置的便道
- //便道初始化程序
- void InitQueue(LinkQueue *Q)
- {
- Q->front=(CQueueNode*)malloc(sizeof(CQueueNode)); //使mallo返回的指针转换为指向CQueueNode类型数据的指针
- if(Q->front!=NULL)
- {
- Q->rear=Q->front;
- Q->front->next=NULL;
- }
- }
- int EnterQueue(LinkQueue *Q,Car *t)
- {
- CQueueNode *NewNode;
- NewNode=(CQueueNode*)malloc(sizeof(CQueueNode)); //给便道申请空间
- if(NewNode!=NULL)
- {
- NewNode->data.num=t->num;
- NewNode->data.t.hour=t->t.hour;
- NewNode->data.t.min=t->t.min;
- NewNode->next=NULL;
- Q->rear->next=NewNode;
- Q->rear=NewNode;
- return 1;
- }
- else return 0;
- }
- void InitStack(Stack *S)
- {
- S->top=0;
- } //确保堆栈为空
- void Push(Stack *S,Car *r) //便道中的车入库
- {
- S->top++;
- S->elem[S->top].num=r->num;
- r->position=S->elem[S->top].position=S->top;
- S->elem[S->top].t.hour=r->t.hour;
- S->elem[S->top].t.min=r->t.min;
- }
- int IsEmpty(Stack* S) //判断车库是否为空
- {
- return(S->top==0?1:0);
- }
- int IsFull(Stack *S) //判断车库是否为满
- {
- return(S->top==SIZE?1:0);
- }
- int GetTop(Stack *S,Car *n) //车离开车库
- {
- n->num=S->elem[S->top].num;
- n->position=S->elem[S->top].position;
- n->t.hour=S->elem[S->top].t.hour;
- n->t.min=S->elem[S->top].t.min;
- return 1;
- }
- int DeleteQueue(LinkQueue *Q,Car *x)
- {
- CQueueNode *p;
- if(Q->front==Q->rear)
- return 0; //判断便道为空
- p=Q->front->next; //将便道中的车放入车库
- Q->front->next=p->next;
- if(Q->rear==p)
- Q->rear=Q->front;
- x->num=p->data.num;
- x->t.hour=p->data.t.hour;
- x->t.min=p->data.t.min;
- free(p); //释放临时指针
- return 1;
- }
- void In(Stack *S,LinkQueue *Q,Car*r)
- {
- if(IsFull(S))
- {
- printf("车库已满,请等待!");
- EnterQueue(Q,r); //车进入便道
- }
- else
- {
- Push(S,r);
- printf("\n您现在所在位置 %d",r->position); //打印车的位置
- }
- }
- void TaM(Car *r,int h,int m)
- {
- if(m>r->t.min)
- {
- r->t.min+=60;
- r->t.hour-=1;
- }
- h=r->t.hour-h;
- m=r->t.min-m;
- printf("\n停车 %d小时 %d 分钟\n",h,m);
- printf("每小时收费30元\n");
- h=h*60;m=h+m;
- r->money=0.5*m;
- printf("请支付金额%.2f元\n",r->money); //输出车主应付金额
- }
- void Out(Stack *S,Stack *S0,Car *r,LinkQueue *Q)
- {
- int tag=S->top;
- Car x;
- if(IsEmpty(S))
- printf("没有此车!");
- else
- {
- for(;r->num!=S->elem[tag].num && tag>0;tag--)
- {
- Push(S0,&S->elem[tag]);
- S->top--;
- }
- if(r->num==S->elem[tag].num)
- {
- TaM(r,S->elem[tag].t.hour,S->elem[tag].t.min);
- S->top--;
- for(;S0->top>0;S0->top--)
- Push(S,&S0->elem[S0->top]);
- if(S->top<SIZE && Q->front!=Q->rear) //判断车库是否有此车,有就找到此车,然后退出
- {
- DeleteQueue(Q,&x);
- Push(S,&x);
- }
- }
- else if(tag==0) //过道中的车无需收车费
- {
- printf("未进入停车场应支付金额 0元!");
- for(;S0->top>0;S0->top--)
- Push(S,&S0->elem[S0->top]);
- }
- }
- }
- void print1(Stack *S)
- {
- int tag;
- Car x;
- printf("停车场停车情况:\n");
- if(IsEmpty(S))
- printf("无车!");
- for(tag=S->top;S->top>0;S->top--)
- if(GetTop(S,&x)) //显示车库中个车的信息及到达时间
- printf("车牌号 %d,所在位置 %d,到达/离开时间 %d:%d\n",x.num,x.position,x.t.hour,x.t.min);
- S->top=tag;
- }
- void print2(LinkQueue *Q)
- {
- CQueueNode *p;
- p=Q->front->next;
- for(;p!=NULL;p=p->next) //显示过道上车的信息及到达时间
- printf("等待车牌号 %d, 到达/离开时间 %d:%d",p->data.num,p->data.t.hour,p->data.t.min);
- }
- void print()
- {
- printf("\n***********************************欢迎光临*************************************\n");
- printf("\n 请选择:\n");
- printf("\n 1 :到达");
- printf("\n 2 :离开");
- printf("\n 3 :搜索");
- printf("\n 4 :退出\n");
- printf("\n");
- }
- int main(void)
- {
- int n,m,i=1,j,flag=0;
- Car c[10];
- Stack S,S0; //设定堆栈S,SO
- LinkQueue Q; //便道
- InitStack(&S); //堆栈S
- InitStack(&S0); //临时堆栈S0
- InitQueue(&Q);
- while(1)
- {
- print();
- scanf("%d",&m);
- switch(m)
- {
- case 1:
- printf("\n请输入车牌号:");
- scanf("%d",&c[i].num);
- printf("\n请输入到达/离开时间:");
- scanf("%d:%d",&c[i].t.hour,&c[i].t.min);
- In(&S,&Q,&c[i]);i++; //车辆的情况
- break;
- case 2:
- printf("\n请输入车牌号:");
- scanf("%d",&n);
- for(j=0;j<10;j++)
- if(n==c[j].num)
- break;
- printf("\n请输入到达/离开时间:");
- scanf("%d:%d",&c[j].t.hour,&c[j].t.min);
- Out(&S,&S0,&c[j],&Q); //车辆的情况
- break;
- case 3:
- print1(&S); //输出车库中车的信息
- print2(&Q); //输出过道上车的信息
- break; //终止
- case 4:
- flag=1;
- break;
- default:
- printf("\n输入错误,请输入 1,2,3 或4");
- }
- if(flag)
- break; //结束程序
- } return 0;
- }