资源描述
停车场问题 完整C程序代码
1)内容: 设停车场是一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的在最北端),若停车场内已经停满 n辆车,那么后来的车只能在场外等候,一旦有车开走,则等候在第一位的车即可开入(这是一个队列设长度为m);当停车场内某辆车需要开出,则在它之后的车辆必须给它让道,当这辆车驶出停车场后,其他车辆按序入栈。每辆车按时间收费。
2)要求: 以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入数据的序列进行模拟管理。每一组输入数据包括三个数据:汽车的“到达”(’A’表示)或“离去”(’D’表示)信息,汽车标识(牌照号)以及到达或离去的时刻。对每一组输入数据进行
操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或者便道上的停车位置;若是车辆离去,则输出汽车在停车场停留的时间和应缴纳的费用(便道上不收费)。栈以顺序结构实现,队列以链表结构实现。
#include<stdio.h>
#include<stdlib.h>
#define pmax 3 //定义停车场的最大容车量为3
#define price 2 //停车单价为2
static int flag=0; //全局变量,用来记录停车场车的数量
struct parkcar //定义车辆的结构体
{
long num;
int time;
struct parkcar*next;
}*head,*rear;
struct parkcar pc[pmax]; //创建停车场的结构体数组
struct parkcar tc[pmax]; //创建用来缓存停车场出来的车辆的结构体数组
struct parkcar *inqueue(long carnum,int atime); //声明入队列函数,让车辆进入候车区
void arrive(void); //声明到达函数
void leave(void); //声明离开函数
void display_P(void); //声明显示停车场车辆信息的函数
void display_W(void); //声明显示侯车区车辆信息的函数
int main()
{
head=NULL; //初始化队列头指针和尾指针
rear=NULL;
int state=0;
printf("\t======Parkcar Menu======\n"); //输出停车菜单
printf("\t price:2\n");
printf("\tinput state\n"); //通过先输入状态(如A),后执行相应函数
printf("\t A arrive\n");
printf("\t D leave\n");
printf("\t P display park_car\n");
printf("\t W display wait_car\n");
printf("\t E quit\n");
do
{
printf("input:\n");
scanf("%c",&state);
fflush(stdin);
switch(state) //通过先输入状态(如A),后执行相应函数
{
case 'A':arrive();break;
case 'D':if(pc[flag-1].num==NULL) //如果停车场为空则输出为空
printf("Park is empty!\n");
else
leave();break;
case 'P':display_P();break;
case 'W':display_W();break;
case 'E':break;
default:printf("error message,input again!\n");
}
}while(state!='E'); //当输入E则退出
return 0;
}
void arrive(void)
{ long carnum;
int atime;
printf("please input carnumber and arrive time!\n");
scanf("%ld %d",&carnum,&atime);fflush(stdin);
if(flag!=pmax) //如果停车场未满,则入停车场
{
pc[flag].num=carnum;
pc[flag].time=atime;
++flag;
}
else
{
inqueue(carnum,atime); //否则进候车区
}
}
struct parkcar *inqueue(long carnum,int atime) //以尾插法建立候车区的队列链表
{
struct parkcar*p;
p=(struct parkcar*)malloc(sizeof(struct parkcar));
p->num=carnum;
p->time=atime;
if(head==NULL)head=p;
else rear->next=p;
rear=p;
rear->next =NULL;
return head;
}
void leave(void)
{
long carnum;
int ltime,dtime; //离开时间,停车时间
int save=0;
int i=1,flag0;
flag0=flag; //flag0用来存储刚调用 离开函数 时flag的值
struct parkcar*p;
printf("please input carnumber and leave time!\n");
scanf("%ld %d",&carnum,<ime);fflush(stdin);
while(pc[flag-1].num !=carnum) //从栈顶往下找要离开的那辆车
{
tc[save].num=pc[flag-1].num;
tc[save].time =pc[flag-1].time ;
tc[save].next =pc[flag-1].next ;
if(flag==1&&pc[0].num !=carnum) //如果找到栈底都没有这辆车,则返回,并将存储着刚调用离开函数时flag的值,即flag0重新
{ //赋值给flag,避免在没有车辆离开的情况下对全局变量flag进行修改而导致错误
printf("This car is not founded!\n");
flag=flag0;
return;
}
flag--;save++;
}
dtime=ltime-pc[flag-1].time ; //停车时间的计算
if(dtime<0) //如果输入的离开时间小于到达时间则重新输入离开时间
{
printf("The leave time is illegal,please input the leave time again\n");
scanf("%d",<ime);fflush(stdin);
dtime=ltime-pc[flag-1].time ;
}
printf("\tpark time:%d\n",dtime);
printf("\tcost: %d\n",dtime*price); //输出停车时间和费用
while(save!=0) //当车辆离开后,将缓存栈里的车回到停车场
{
if(i--)flag--; //因为执行完上一个while循环后 flag少执行了一次减一操作,通过控制i来让flag在这个循环里只减一次。但flag--
save--; //放在while(save!=0)外面,这样对某些输入会有bug。也就是只有当缓存栈里有车时才需要flag做一次减一操作
pc[flag].num =tc[save].num ;
pc[flag].time =tc[save].time ;
flag++;
}
if(head!=NULL) //如果候车区不空,则将队首第一辆车进入停车场
{
p=head;
pc[flag].num =p->num;
pc[flag].time =ltime;
pc[flag].next =p->next ;
flag++;
printf("\t'%ld'car in park,arrive time:%d\n",p->num ,ltime); //显示从候车区进停车场的车辆车牌号和进入时间
head=head->next;
free (p);
}
}
void display_P(void) //从栈顶往栈底显示停车场的车辆信息
{
int flag1;
flag1=flag; //用flag1记录此时的flag,避免对全局变量进行操作
printf("\tpark_carnum arrive_time\n");fflush(stdin);
while((flag1)!=0)
{
printf("\t%ld %d\n",pc[flag1-1].num,pc[flag1-1].time);
flag1--;
}
}
void display_W(void) //从队首往队尾显示候车区的车辆信息
{
struct parkcar*w;
w=head;
printf("\twait_carnum arrive_time\n");
while(w!=NULL)
{
printf("\t%ld %d\n",w->num,w->time);
w=w->next;
}
free(w);
}
/*
可参考的测试数据,含一定健壮性,复制粘贴可用
D
A
101 5
A
102 10
P
D
103 15
D
101 15
P
A
103 20
A
104 25
A
105 30
P
W
D
102 35
P
W
D
104 20
40
P
W
E
*/
展开阅读全文