栈,链队列的基本应用。
#include<stdio.h>
#include<malloc.h>
#define Size 3//停车场的容量
#define Price 0.1//每分钟的价钱
#define Null 0
typedef struct time//定义时间
{
int hour;//小时
int min;//分钟
}Time;//时间结点
typedef struct
{
int car_number;//车牌号
int number;
Time arrivetime,leavetime;//到达时间,离开时间
int fee;//所需费用
}car_info;//车辆的信息结点
typedef struct
{
car_info *north;//车场北
car_info *south;//车场南
int number;//停车数量
int car_number;
}car_park;//停车场
typedef struct
{
car_info *west;//车场西
car_info *east;//车场东
int number;//停车数量
}car_park_back;//倒车道
typedef struct car//链队列的定义
{
car_info data;//数据域
struct car *next; //指针域
}carnode;
typedef struct node
{
carnode *head;//头结点
carnode *rear;//尾结点
int number;//停车数量
}car_park_temp;//便道
void init_car_park(car_park *cp)//停车场初始化
{
cp->north=(car_info *)malloc(Size * sizeof(car_info));//申请空间
if(!cp->north) printf("error\n");//申请空间失败
cp->south=cp->north;
cp->number=0;//构造一个空栈
}
void enter_car_park(car_park *cp,car_info *car)//进入停车场
{
*cp->south++=*car;
cp->number++; //修改当前栈顶指针
}
int notfull_car_park(car_park *cp)
//判断停车场是否有空位
{
int e;
if(cp->south-cp->north>=Size) //从南到北的车辆数为5,则停车场已满
e=0; //停车场满返回0
else
e=1; //停车场未满返回1
return(e);
}
int notempty_car_park_back(car_park_back *cpb)
//判断倒车道是否还有车
{
int e;
if(cpb->east==cpb->west)//倒车道为空
e=0; //返回0
else
e=1; //倒车道有车返回1
return(e);
}
void back_car_park(car_park *cp,car_info *car)
//从停车场倒车
{
*car=*cp->south;
cp->number--;
}
void init_car_park_back(car_park_back *cpb)//初始化倒车道
{
cpb->west=(car_info *)malloc(Size *sizeof(car_info));//申请空间
if(!cpb->west) printf("error\n");//申请空间失败
cpb->east=cpb->west;
cpb->number=0;//构造一个空栈
}
void enter_car_park_back(car_park_back *cpb,car_info *car)//进入倒车道
{
*cpb->east++=*car;
cpb->number++;//修改当前的栈顶指针
}
void leave_car_park_back(car_park_back *cpb,car_info *car)//离开倒车道
{
*car=*--cpb->east;
cpb->number--;
}
void init_car_park_temp(car_park_temp *cpt)//初始化便道
//将cpt初始化为一个空的链队列
{
cpt->head=cpt->rear=(carnode *)malloc(sizeof(carnode));//申请空间
cpt->head->next=Null;
cpt->number=0;
}
void enter_car_park_temp(car_park_temp *cpt,car_info *car)
//进入便道
//将数据元素car插入到队列cpt中
{
carnode *p;
p=(carnode *)malloc(sizeof(carnode));//申请结点p
p->data=*car;
p->next=Null;
cpt->head->next=p;
cpt->rear=p;
cpt->number++;
}
void leave_car_park_temp(car_park_temp *cpt,car_info *car,car_park *cp)
//离开便道,将队列cpt的队头元素出队
{
carnode *p;
p=cpt->head->next;
*car=p->data;
cpt->head=p->next; //队头元素p出队
enter_car_park(cp, car);//调用进入停车场的函数
cpt->number--; //便道的车辆少1
}
int notempty_car_park_temp(car_park_temp *cpt)
//判断便道是否还有车
{
int e;
if(cpt->head==cpt->rear)
e=0; //便道为空则返回0
else
e=1; //便道不空则返回1
return(e);
}
void leave_car_park(car_park *cp,car_info *car,car_park_back *cpb)
//某车离开停车场,并计算该车的费用
{
int e, a1,a2,b1,b2,t;
car_info *car1,*car2,*car3;//三辆车的信息
car1=(car_info *)malloc(sizeof(car_info));//为第一辆车申请空间
car2=(car_info *)malloc(sizeof(car_info));//为第二辆车申请空间
car3=(car_info *)malloc(sizeof(car_info));//为第三辆车申请空间
while((--cp->south)->car_number!=car->car_number)//从停车场倒车
{
back_car_park(cp,car1);//出停车场
enter_car_park_back(cpb,car1);//进入倒车道
}
car->arrivetime.hour=cp->south->arrivetime.hour;car->arrivetime.min=cp->south->arrivetime.min;
a1=car->arrivetime.hour;
a2=car->arrivetime.min;
b1=car->leavetime.hour;
b2=car->leavetime.min;
t=(b1-a1)*60+(b2-a2);//计算车辆在停车场停留的时间
car->fee=t*Price;//计算车辆应交的费用
printf("\n车辆停留的时间是: %3d min\n",t);//输出车辆停留的时间
printf("\n应交的费用是 %3d 元\n",car->fee);//输出车辆应交的费用
e=notempty_car_park_back(cpb);//判断车道是否为空
while(e==1)
{
leave_car_park_back(cpb,car2);
enter_car_park(cp,car2);
e=notempty_car_park_back(cpb);
}//离开倒车道,进入停车场
cp->number--;
}
void List1(car_park *cp) /*列表显示车场信息*/
{int a;
int b;
int i;
if(cp->number>0) /*判断车站内是否有车*/
{
for( i=0;i<cp->number;i++)
{
cp->south--;
a=cp->south->car_number;
b=cp->number-i;
printf("\n位置%d",b);
printf("\n车牌号%d",a);
}
}
else
printf("\n车场里没有车");
}
void List2(car_park_temp *cpt) /*列表显示便道信息*/
{ int a;
int b;
if(cpt->number>0)
{
a=cpt->number;
b=cpt->head->data.car_number;
printf("\n便道里有%d辆车",a);
printf("\n车牌号为:%d",b);
}
else
printf("\n便道里没有车");
}
void main()
{
char ch;
int e,n;
//QueueNode *p;
car_park_back *cpb;
car_park *cp;
car_park_temp *cpt;
car_info *car;
cp=(car_park *)malloc(sizeof(car_park));
cpb=(car_park_back *)malloc(sizeof(car_park));
cpt=(car_park_temp *)malloc(sizeof(car_park_temp));
init_car_park(cp); //初始化停车场
init_car_park_back(cpb);//初始化倒车道
init_car_park_temp(cpt);//初始化便道
do
{
car=(car_info *)malloc(sizeof(car_info));
printf("\n\n************ 模拟停车场管理问题***************\n\n");
printf("请选择你的操作 \n'A' 到达\n'L'离开\n'C'查看停车场信息 \n'D'查看便道信息\n'0'退出:\n");
scanf("%s",&ch);
e=notfull_car_park(cp);
switch(ch)
{
case'A':if(e==1)//停车场未满
{
printf("请输入车牌号:\n");
scanf("%d",&car->car_number);
printf("请输入到达时间,hour min:\n");
scanf("%d %d",&(*car).arrivetime.hour,&(*car).arrivetime.min);
enter_car_park(cp,car);//进入停车场
printf("此车在停车场中,位置在: %d\n",cp->number);
}
else//停车场已满
{
car_info *car;
car=(car_info*)malloc(sizeof(car_info));
printf("请输入车牌号:\n");
scanf("%d",&car->car_number);//进入便道
enter_car_park_temp(cpt,car);
printf("停车场已满,车在便道中,位置是: %d\n",cpt->number);
}
break;
case 'L':
printf("请输入车牌号:\n");
scanf("%d",&car->car_number);
printf("请输入离开时间hour min:\n");
scanf("%d %d",&(*car).leavetime.hour,&(*car).leavetime.min);
leave_car_park(cp,car,cpb);//离开停车场
n=notempty_car_park_temp(cpt);//判断便道车辆是否为空
if(n==1)//便道上有车辆
leave_car_park_temp(cpt,car,cp);//离开便道
break;
case'C': List1(cp); break;
case'D': List2(cpt); break;
default:break;
}
}while(ch!='0');//退出系统
}
### 停车场管理系统分析
本篇将详细介绍一个基于栈和链队列实现的停车场管理系统,该系统涉及到了停车场的进出管理、费用计算、以及停车场状态查询等功能。通过具体的代码实现来阐述栈和链队列这两种数据结构的应用场景。
#### 1. 数据结构与类型定义
我们来看一下系统中涉及到的主要数据结构与类型定义:
- **Time** 结构体:用于存储车辆的到达时间和离开时间。
- `int hour;`:小时数。
- `int min;`:分钟数。
- **car_info** 结构体:用于存储车辆的具体信息。
- `int car_number;`:车牌号码。
- `Time arrivetime, leavetime;`:到达时间和离开时间。
- `int fee;`:停车费用。
- **car_park** 结构体:用于表示停车场。
- `car_info *north;`:指向停车场北端的位置。
- `car_info *south;`:指向停车场南端的位置。
- `int number;`:当前停泊车辆的数量。
- `int car_number;`:停车场中的车辆编号。
- **car_park_back** 结构体:用于表示倒车道。
- `car_info *west;`:指向倒车道西端的位置。
- `car_info *east;`:指向倒车道东端的位置。
- `int number;`:当前倒车道中的车辆数量。
- **car_park_temp** 结构体:用于表示临时停放区(即便道)。
- `carnode *head;`:链表的头结点。
- `carnode *rear;`:链表的尾结点。
- `int number;`:当前便道中的车辆数量。
- **carnode** 结构体:用于构建链表节点。
- `car_info data;`:车辆信息。
- `struct car *next;`:指向下一个节点的指针。
#### 2. 函数实现与逻辑流程
接下来,我们将逐一介绍各个关键函数的实现及其功能:
- **初始化函数**:
- `init_car_park()`:初始化停车场,分配内存并设置初始状态。
- `init_car_park_back()`:初始化倒车道,同样进行内存分配和状态设置。
- `init_car_park_temp()`:初始化便道(临时停车区),创建一个空链表。
- **停车场管理**:
- `enter_car_park()`:车辆进入停车场。修改指向停车场南端的指针,并增加车辆数量计数器。
- `leave_car_park()`:车辆离开停车场。根据车辆的停留时间计算费用,并更新停车场状态。
- `notfull_car_park()`:检查停车场是否有空位。
- `back_car_park()`:将车辆从停车场移动到倒车道。
- **倒车道管理**:
- `enter_car_park_back()`:车辆进入倒车道。修改指向倒车道东端的指针,并增加车辆数量计数器。
- `leave_car_park_back()`:车辆离开倒车道。修改指向倒车道东端的指针,并减少车辆数量计数器。
- `notempty_car_park_back()`:检查倒车道是否有车辆。
- **便道管理**:
- `enter_car_park_temp()`:车辆进入便道。在链表尾部添加一个新节点。
- `leave_car_park_temp()`:车辆离开便道。删除链表头部节点,并将车辆信息传递给停车场。
- `notempty_car_park_temp()`:检查便道是否有车辆。
- **显示信息**:
- `List1()`:列出停车场中所有车辆的信息。
- `List2()`:列出便道中所有车辆的信息。
#### 3. 主程序逻辑
主程序通过循环让用户选择操作,包括到达、离开、查看停车场信息、查看便道信息等。程序会根据用户的输入执行相应的操作,例如当用户选择到达时,程序会检查停车场是否满员,如果未满则直接将车辆加入停车场;如果已满,则将车辆加入便道。
#### 4. 小结
本文通过具体代码实现,介绍了如何利用栈和链队列两种数据结构实现停车场管理系统的核心功能。这种实现方式既简单又高效,能够很好地处理日常停车场的进出管理需求。此外,该系统还支持实时查询停车场和便道的状态,便于管理者进行监控和调整。