#include <stdio.h>
#define MAX 3 //模拟停车场最多可停的车辆数,从0开始,可以停放4辆车
//车的必要信息的结构体
typedef struct{
int number;
int arrive_time;
}zanInode;
//进入停车场的处理函数
int push(zanInode* park,int* parktop,zanInode car)
{
//如果停车场已满,该车需进入便道等待(先返回 -1 ,在主程序中处理)
if((*parktop)>MAX)
{
printf("停车场已停满!需停到便道上.\n");
return -1;
}else{ //否则将该车入栈,同时进行输出
park[(*parktop)]=car;
printf("该车在停车场的第 %d 的位置上\n",(*parktop)+1);
(*parktop)++;
return 1;
}
}
//车从停车场中退出的处理函数
zanInode pop(zanInode* park,int* parktop,int carnumber,zanInode* location,int* locationtop)
{
int i;
//由于函数本身的返回值需要返回一辆车,所以需要先初始化一个
zanInode thecar;
thecar.number=-1;
thecar.arrive_time=-1;
//在停车场中找到要出去的车
for(i=-1;i<(*parktop);i++)
{
if(park[i].number==carnumber){
break;
}
}
printf("i=%d,parktop=%d\r\n",i,*parktop);
//如果遍历至最后一辆车,还没有找到,证明停车场中没有这辆车
if(i==(*parktop)){
printf("停车场中没有该车\n");
}else{ //就将该车移出停车场,//首先将在该车后进入停车场的车全部挪至另一个栈中
while((*parktop)>=i)
{
(*parktop)--;
location[*locationtop]=park[*parktop];
(*locationtop)++;
}
//接着轮到被出栈的车辆了。栈顶指针继续下移
(*parktop)--;
thecar=park[*parktop];
//该车出栈后,还要将之前出栈的所有车,在全部进栈
while((*locationtop)>0)
{
(*locationtop)--;
park[*parktop]=location[*locationtop];
(*parktop)++;
}
}
return thecar;
}
int main(int argc,const char* argv[])
{
//停车场的栈
zanInode park[MAX];
int parktop=0; //栈顶指针
//辅助停车场进行挪车的栈
zanInode location[MAX];
int locationtop=0; //栈顶指针
//模拟便道的队列
zanInode accessroad[100];
int front,rear; //队头和队尾指针
front=rear=0;
char order; //进出停车场的输入命令
int carNumber; //车牌号
int arriveTime; //到停车场的时间
int leaveTime; //离开停车场的时间
int time; //车在停车场中逗留的时间
int result;
zanInode car;
printf("有车辆进入停车场(A);有车辆出停车场(D);程序停止(#):\n");
while(scanf("%c",&order))
{
if(order=='#')
{
break;
}
switch(order)
{
case 'A':
printf("登记车牌号(车牌号不能为 -1)及车辆到达时间(按小时为准):\n");
scanf("%d %d",&carNumber,&arriveTime);
car.number=carNumber;
car.arrive_time=arriveTime;
//当有车想要进入停车场时,首先试图将该车进入停车场
result=push(park,&parktop,car);
//如果返回值为 -1 ,证明停车场已满,需要停在便道中
if(result==-1) //停在便道上
{
accessroad[rear]=car;
printf("该车在便道的第 %d 的位置上\n",rear+1-front);
rear++;
}
break;
case 'D':
printf("出停车场的车的车牌号以及离开的时间:\n");
scanf("%d %d",&carNumber,&leaveTime);
//当有车需要出停车场时,调用出栈函数
car=pop(park,&parktop,carNumber,location,&locationtop);
//如果返回的车的车牌号为-1 ,表明在停车场中没有查找到要查找的车
if(car.number!=-1)
{
//停留时间,等于进停车场的时间-
time=leaveTime-car.arrive_time;
printf("car.arrive_time=%d",car.arrive_time);
printf("该车停留的时间为:%d 小时,应缴费用为:%f 元\n",time,time*1.5);
//一旦有车离开停车场,则在便道中先等待的车就可以进入,进入时需设定车进入的时间
if(front!=rear)
{
car=accessroad[front];
printf("在便道上第 1 的位置上,车牌号为:%d 的车进停车场的时间为:\n",car.number);
scanf("%d",&car.arrive_time);
park[parktop]=car;
front++;
parktop++;
}
else{
printf("便道上没有等待车辆,停车场不满!\n");
}
}
break;
default:
break;
}
printf("\n 有车辆进入停车场(A);有车辆出停车场(D);程序停止(#):\n");
scanf("%*[^\n]");
scanf("%*c");//清空缓冲区
}
return 0;
}
数据结构实践项目-------停车场管理系统
猜你喜欢
转载自blog.csdn.net/aa804738534/article/details/113760127
今日推荐
周排行