1要求:设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车时间的早晚依次从停车场最里面向大门口停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在它之后近来的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制一程序模拟停车场管理。
实现提示:汽车的模拟输入信息格式可以是:(到达/离去,汽车牌照号码,到达/离去的时刻)。
例如:(‘A’,1,5)表示一号牌照车爱5这个时刻到达,而(‘D’,5,20)表示5号牌照车在20这个时刻离去,整个程序可以在输入信息为(‘E’,0,0)时结束。
基本要求:要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交纳的费用和它在停车场内停留的时间。
2.代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 2//车库容量 为了便于观察这里把车库容量设置为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 *front;
QueueNode *rear;
}LinkQueueCar;//模拟通道
///////////////////////////////////////////////////*定义方法*/
void InitStack(SeqStackCar*);//初始化车站
int InitQueue(LinkQueueCar*);//初始化便道
int Arrival(SeqStackCar*,LinkQueueCar*);//车辆到达
void Leave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);//车辆离开
void List(SeqStackCar,LinkQueueCar);//显示存车信息
/////////////////////////////////////////////*主函数*/
void main()
{
SeqStackCar Enter,Temp;
LinkQueueCar Wait;
int ch;
InitStack(&Enter);//构造一个空栈
InitStack(&Temp);//
InitQueue(&Wait);//构造一个空队列
while(1)
{
printf(“/n1.车辆到达 “);
printf(“/n2.车辆离开“);
printf(“/n3.列表显示“);
printf(“/n4.退出系统/n”);
while(1)
{
printf(“/n请选择:1 2 3 4″);
scanf(“%d”,&ch);
if(ch<1&&ch>4)//当不符合要求时重新进行选择
{
break;
}
else
{//否则则进行方法的操作
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->front=(QueueNode*)malloc(sizeof(QueueNode));
if(Q->front!=NULL)
{
Q->front->next=NULL;//队列头结点为空
Q->rear=Q->front;
return (1);
}else{
return (0);
}
}
///////////////////////////////////////////////*离站所进行的操作*/
void PRINT(CarNode *p,int room){
int A1,A2,B1,B2;
printf(“/n请输入离开的时间:“);
scanf(“%d:%d”,&(p->leave.hour),&(p->leave.min));
printf(“/n离开车辆的车牌号为:“);
puts(p->num);
printf(“/n其到达时间为:%d:%d”,p->reach.hour,p->reach.min);
printf(“离开时间为:%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(“/n应缴费用为:%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(“/n请输入车牌号:“);
gets(p->num);//得到车牌号
if(Enter->top<MAX){//判断 如果停车场未满 则进入
Enter->top++;//top指针加一
printf(“/n车辆在停车场内的第%d位置“,Enter->top);
printf(“/n请输入到达时间:“);
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;//t结点的下一个结点为空
W->front->next=t;//头指针的下一个为t
W->rear=t;//尾指针指向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请输入车在车场的位置:“,Enter->top);
scanf(“%d”,&room);
if(room<1&&room>=Enter->top)
{
break;
}
while(Enter->top>room)
{
Temp->top++;//top指针加一
Temp->stack[Temp->top]=Enter->stack[Enter->top];//把停车场里的车放 入temp中
Enter->stack[Enter->top]=NULL;//把停车场里的位置清空
Enter->top–;//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->front!=W->rear)&&Enter->top<MAX)//如果便道上有车 并且停车场里有 空位
{
q=W->front->next;//把便道里的车赋给q
t=q->data;//车的信息赋给t
Enter->top++;
printf(“/n便道的%s号车进入车场第%d位置。“,t->num,Enter->top);
printf(“/n请输入现在的时间:“);
scanf(“%d:%d”,&(t->reach.hour),&(t->reach.min));
W->front->next=q->next;//头指针指向q的下一个
if(q==W->rear)//如果便道里没车
{
W->rear=W->front;//清空
Enter->stack[Enter->top]=t;//进入停车场
printf(“/n便道里没车/n”);
free(q);
}
break;
}
else
{
printf(“/n车场里没车。“);
}
break;
}
}
}
//////////////////////////////////////////////////*列表的显示信息*/
void List1(SeqStackCar *s)
{
int i;
if(s->top>0)
{
printf(“/n车场“);
printf(“/n位置 到达时间 车牌号/n”);
for(i=1;i<=s->top;i++)
{
printf(“%d%10d:%d “, i, 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->front->next;
if(w->front!=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,m;
flag=1;
while(flag)
{
printf(“/n请选择 1 2 3″);
printf(“/n1.车场 /n2.便道 /n3.返回“);
while(1)
{
scanf(“%d”,&m);
if(m>=1||m<=3)
break;
else printf(“/n”);
}
switch(m)
{
case 1:
List1(&s);
break;
case 2:
List2(&w);
break;
case 3:
flag=0;
break;
default:
break;
}
}
}