项目要求:
停车场是一个能放 n 辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要在门外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车要先退出,待它走后依次进入。汽车离开时按停放时间收费。
基本功能要求:
1)建立三个数据结构分别是:停放队列,让路栈,等候队列
2)输入数据模拟管理过程,数据(入或出,车号)。
//头文件
#include<stdio.h>
#include<stdlib.h> /*system(cls)函数用到的头文件*/
#include<conio.h> /*getch()函数用到的头文件*/
#include<windows.h>
#include<string.h>
#include<malloc.h>
#include <time.h>
//宏定义
#define MAX_LEN 15
#define MAX_STOP 5 //停车场一共有5个停车位
#define MAX_PAVE 3 //便道不限制停放车辆的数目,设为足够大
#define MAX 105
#define price 2//每小时收费2元
//结构体
//汽车
typedef struct {
char license_plate[10]; //汽车牌照号码,定义为一个字符指针类型
char state[3]; //汽车的当前状态,字符s表示停放在停车位上,字符p表示停放在便道上,每辆车的初始状态用字符i表示
int inhour;
int inminute;
int outhour;
int outminute;
}CAR;
//停车场
typedef struct{
CAR STOP[MAX_STOP]; //各汽车信息的存储空间
int top; //用来指示栈顶位置
}STOPPING;
//辅助位置
typedef struct{
CAR BUFF[MAX_STOP]; //各汽车信息的存储空间
int top; //用来指示栈顶位置的静态指针
}BUFFER;
//便道
typedef struct{
CAR PAVE[MAX_PAVE-1]; //各汽车信息的存储空间
int front, rear; //用来指示队头和队尾位置
int count; //记录汽车的数量
}PAVEMENT;
STOPPING *s; //停车场
BUFFER *b; //辅助位置
PAVEMENT *p; //便道
char carname[17];
int Timeh[MAX_STOP];//各车辆进入停车场的小时
int Timem[MAX_STOP];//各车辆进入停车场的分钟
int timeh; //车辆离开停车场的小时
int timem; //车辆离开停车场的分钟
int totaltime;
//--------------------------------------------------------
//函数声明
STOPPING *init_stopping(); //初始化“停车位栈”
BUFFER *init_buff(); //初始化“辅助栈”
PAVEMENT *init_pavement(); //初始化“便道队列”
void car_come(); //汽车信息输入“停车位栈”,并打印该车状态
void stop_to_buff(); //汽车信息从“停车位栈”移动到“辅助栈”
void buff_to_stop(); //汽车信息从“辅助栈”移动到“停车位栈”
void pave_to_stop(); //汽车信息从“便道队列”移动到“停车位栈”
void Car_to_pave(PAVEMENT *p,char name[MAX_LEN]);//车辆进入便道
void display(); //显示车辆信息的界面
void welcome(); //欢迎界面
void come(); //汽车进入停车位管理模块
void leave(); //汽车离开停车位管理模块
void Car_mid(); //车从停车场离场的中间步骤
void out_Time(); //记录出停车场的时间
//--------------------------------------------------------
//欢迎界面
void welcome()
{
system("cls");
printf("\n\n\n\n\n");
printf("\t\t|-------------------------------**欢迎使用本程序**-------------------------------|\n");
printf(" \n");
printf("\t\t|\t\t本程序为停车场的模拟管理程序,进入停车场请按【1】键。 |\n");
printf("\t\t|\t\t根据屏幕提示进行相关操作,车要离开时请按 【2】键。 |\n");
printf("\t\t|\t\t根据屏幕提示相进行关的操作,查看停车场状态和便道上的状态请按【3】|\n");
printf("\t\t|\t\t根据屏幕提示进行相关操作,要退出程序请按 【0】键。 |\n");
printf("\t\t|\t\t注意:输入完毕或操作完成后按【Enter】或【空格】均可进行下一步操作|\n");
printf("\t\t|\t\t下面请选择您要进行的操作: |\n");
printf(" \n");
printf("\t\t|--------------------------------------------------------------------------------|\n\n");
printf("\t\t\tplease choose (0-3): ");
}
//初始化“停车位栈”
STOPPING *init_stopping()
{
STOPPING *s=(STOPPING*)malloc(sizeof(STOPPING));//分配内存空间
s->top=-1;
return s;
}
//初始化“辅助栈”
BUFFER *init_buff()
{
BUFFER *b=(BUFFER*)malloc(sizeof(BUFFER)); //分配内存空间
b->top=-1;
return b;
}
//初始化“便道队列”
PAVEMENT *init_pavement()
{
PAVEMENT *p=(PAVEMENT*)malloc(sizeof(PAVEMENT));//分配内存空间
p->front=p->rear=MAX_PAVE-1; //初始化一个循环队列
p->count=0;
return p;
}
//车辆进入便道
void Car_to_pave(PAVEMENT *p,char name[MAX_LEN])
{
if(p->count>0&&p->front==(p->rear+1)%MAX_PAVE)//如果便道已满,给一个提示
{
printf("Sorry! 便道已满,停车场没有空位了。\n");
return ;
}
else
{
p->rear=(p->rear+1)%MAX_PAVE;
p->count++;
strcpy(p->PAVE[p->rear].license_plate,carname);
strcpy(p->PAVE[p->rear].state,"p");//状态
printf("%s号车,您好!\n",carname);
printf("%s开入便道%d号车位\n",carname,p->rear+1);//车位:1--5号
}
}
//汽车信息输入“停车位栈”,并打印该车状态
void car_come()
{
printf("停车场有空闲位置,请输入此时的时间(h,m):\n");
s->top++;
scanf(" %d:%d",&s->STOP[s->top].inhour,&s->STOP[s->top].inminute);//输入进入停车场各车辆时间
Timeh[s->top]=s->STOP[s->top].inhour;
Timem[s->top]=s->STOP[s->top].inminute;//记录进入停车场各车辆时间
strcpy(s->STOP[s->top].license_plate,carname);//存储各车辆牌号信息
strcpy(s->STOP[s->top].state,"s"); //修改该车状态
printf("%s号车,您好!\n",carname);
printf("%s开入停车场%d号车位\n",carname,s->top+1);
}
//汽车进入停车位管理模块
void come()
{
printf("请输入您的车牌号:");
scanf("%s",carname);
if(s->top==MAX_STOP-1)//判断停车场是否满位
{
Car_to_pave(p,carname);//把车停到便道上
}
else
{
printf("停车场有空闲位置\n");
//将汽车压入“停车位栈”,并修改该车状态
car_come();
}
}
//将汽车从“停车位栈”移动到“辅助栈”
void stop_to_buff()
{
strcpy(b->BUFF[++b->top].license_plate,s->STOP[s->top+1].license_plate);//要离开的车后面车辆压入辅助栈
strcpy(s->STOP[s->top+1].state,"i"); //修改车辆的状态
printf("牌照为%s的汽车暂时退出停车场\n",s->STOP[s->top+1].license_plate);
}
//汽车信息从“辅助栈”移动到“停车位栈”
void buff_to_stop()
{
while(b->top>=0)//从辅助栈压入临时停放的车辆
{
strcpy(s->STOP[++s->top].license_plate,b->BUFF[b->top--].license_plate);
}
}
//汽车信息从“便道队列”移动到“停车位栈”
void pave_to_stop()
{
int i;
strcpy(s->STOP[++s->top].license_plate,p->PAVE[p->front].license_plate);//将便道的车停入停车场
printf("牌照为%s的汽车停回停车场%d号车位\n",p->PAVE[p->front].license_plate,s->top+1);
if(p->count>1)
{
for(i=p->front+1; i<p->count; i++)
{
strcpy(p->PAVE[i-1].license_plate,p->PAVE[i].license_plate);//便道上车停入停车场后,便道中的车前移
}
p->rear--;
p->front--;
p->count--;
}
else//便道中有1个车
{
p->rear=MAX_PAVE-1;
p->front=MAX_PAVE-1;
p->count=0;
}
}
//车从停车场离场的中间步骤
void Car_mid()
{
int find = 0;
while(s->top>=0)
{
if(strcmp(s->STOP[s->top--].license_plate,carname)==0)//寻找要离开的车辆,若找到则跳出此循环
{
find = 1;
break;
}
else
{
//汽车信息从“停车位栈”移动到“辅助栈”
stop_to_buff();
}
}
if(!find)//未找到此车
{
printf("查无此车!\n");
while(b->top>=0)//从辅助栈压入临时停放的车辆
{
strcpy(s->STOP[++s->top].license_plate,b->BUFF[b->top--].license_plate);
}
return ;
}
else
{
out_Time();
//汽车信息从“辅助栈”移动到“停车位栈”
buff_to_stop ();
if(s->top<=MAX_STOP-1&&p->count>0)//
{
p->front=(p->front+1)%MAX_PAVE;
//汽车信息从“便道队列”移动到“停车位栈”
pave_to_stop();
}
}
}
//记录出停车场的时间
void out_Time()
{
int i;
printf("请输入此时离开的时间:\n");
scanf("%d:%d",&s->STOP[s->top+1].outhour,&s->STOP[s->top+1].outminute);
timeh=s->STOP[s->top+1].outhour;//记录离开车的小时
timem=s->STOP[s->top+1].outminute;//记录离开车的分钟
if(Timeh[s->top+1]==timeh)//出去和进入的小时是相同的,不满一小时
{
totaltime=1;
}
else
{
totaltime=timeh-Timeh[s->top+1]+(timem>Timem[s->top+1]?1:0);//计算停车的时间,小时
}
printf("牌照为%s的汽车从停车场开走\n",s->STOP[s->top+1].license_plate);
printf("停车%d小时,应收费%d元\n",totaltime,price*totaltime);
if(s->top+1>=0)
{
for(i=s->top+1; i<MAX_STOP-1; i++)
{
Timeh[i]=Timeh[i+1];//离开车辆位置后的车辆进入时间往前移一位
Timem[i]=Timem[i+1];//记录原来车辆的进入时间
}
Timeh[MAX_STOP]=timeh;
Timem[MAX_STOP]=timem;//最外头的是新进来车辆的时间;先是辅助栈进入停车场,然后是便道的车辆进入停车场
}
}
//车辆离开
void leave()
{
printf("请输入将要离开的车牌号:");
scanf("%s",carname);
if(s->top<0) //停车场是空的
printf("停车场为空!\n");
else
Car_mid();
}
void display()
{
int i;
if(s->top==-1)
{
printf("停车场为空!\n");
}
else
{
printf("停车场有%d个车位,已停%d个车位,便道有车位%d个,便道已停%d个车位\n",MAX_STOP,s->top+1,MAX_PAVE-1,p->count);
if(p->count>0)
{
printf("停车场车辆情况:\n");
for(i=0; i<=s->top; i++)
{
printf("%d号停车车位:%s\n",i+1,s->STOP[i].license_plate);
}
printf("便道车辆情况:\n");
for(i=0; i<p->count; i++)
{
printf("%d号便道车位:%s\n",i+1,p->PAVE[i].license_plate);
}
}
else
{
printf("停车场车辆情况:\n");
for(i=0; i<=s->top; i++)
{
printf("%s\n",s->STOP[i].license_plate);
}
printf("便道为空!\n");
}
}
}
int main()
{
s=init_stopping(); //初始化“停车位栈”
b=init_buff(); //初始化“辅助栈”
p=init_pavement(); //初始化“便道队列”
int option;
welcome();
scanf("%d",&option);
while(option)
{
switch(option)
{
case 1: come();break;
case 2: leave();break;
case 3: display();break;
default: break;
}
getch();
welcome();
scanf("%d",&option);
}
printf("谢谢使用,再会!\n");
return 0;
}
[还有一种简易的初始化栈和队列的方法:](http://ddrv.cn/a/83269)