做一个停车场管理系统C语言实现,停车场用栈实现,便道用队列实现,输出停车费,车辆停留时间,车辆位置
时间: 2024-03-08 20:51:03 浏览: 15
好的,我了解了您的要求。下面是一个简单的停车场管理系统的C语言实现,停车场使用栈实现,便道使用队列实现。
首先,我们需要定义停车场和便道的数据结构。停车场使用一个栈来存储车辆,每个元素包含车辆的信息和停车时间;便道使用一个队列来存储等待进入停车场的车辆,每个元素包含车辆的信息。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100
// 车辆信息结构体
typedef struct {
char license[10]; // 车牌号
int arrival_time; // 到达时间
int leave_time; // 离开时间
} Car;
// 停车场结构体
typedef struct {
Car cars[MAX_SIZE]; // 存储车辆的数组
int top; // 栈顶指针
} ParkingLot;
// 便道结构体
typedef struct {
Car cars[MAX_SIZE]; // 存储车辆的数组
int front; // 队列头指针
int rear; // 队列尾指针
} WaitingLane;
```
接下来,我们需要实现栈和队列的基本操作。这里使用顺序存储结构来实现栈和队列。
```c
// 初始化停车场
void init_parking_lot(ParkingLot *pl)
{
pl->top = -1;
}
// 判断停车场是否已满
int is_full_parking_lot(ParkingLot *pl)
{
return pl->top == MAX_SIZE - 1;
}
// 判断停车场是否为空
int is_empty_parking_lot(ParkingLot *pl)
{
return pl->top == -1;
}
// 停车场进入一辆车
void enter_parking_lot(ParkingLot *pl, char *license, int arrival_time)
{
if (is_full_parking_lot(pl)) {
printf("停车场已满,%s需要等待进入停车场\n", license);
return;
}
pl->top++;
strcpy(pl->cars[pl->top].license, license);
pl->cars[pl->top].arrival_time = arrival_time;
printf("%s进入停车场,停车位置为%d\n", license, pl->top + 1);
}
// 停车场离开一辆车
void leave_parking_lot(ParkingLot *pl, char *license, int leave_time)
{
int i;
int parked_time;
if (is_empty_parking_lot(pl)) {
printf("停车场为空,%s不在停车场内\n", license);
return;
}
// 查找车辆在停车场中的位置
for (i = pl->top; i >= 0; i--) {
if (strcmp(pl->cars[i].license, license) == 0) {
break;
}
}
if (i < 0) {
printf("%s不在停车场内\n", license);
return;
}
parked_time = leave_time - pl->cars[i].arrival_time;
printf("%s离开停车场,停留时间为%d小时,停车费为%d元\n", license, parked_time, parked_time * 10);
// 将该位置上的车辆出栈
for (; i < pl->top; i++) {
pl->cars[i] = pl->cars[i + 1];
}
pl->top--;
}
// 初始化便道
void init_waiting_lane(WaitingLane *wl)
{
wl->front = wl->rear = -1;
}
// 判断便道是否已满
int is_full_waiting_lane(WaitingLane *wl)
{
return wl->rear == MAX_SIZE - 1;
}
// 判断便道是否为空
int is_empty_waiting_lane(WaitingLane *wl)
{
return wl->front == -1;
}
// 车辆进入便道
void enter_waiting_lane(WaitingLane *wl, char *license, int arrival_time)
{
if (is_full_waiting_lane(wl)) {
printf("便道已满,%s无法进入便道\n", license);
return;
}
if (is_empty_waiting_lane(wl)) {
wl->front++;
}
wl->rear++;
strcpy(wl->cars[wl->rear].license, license);
wl->cars[wl->rear].arrival_time = arrival_time;
printf("%s进入便道,等待进入停车场\n", license);
}
// 车辆离开便道进入停车场
void leave_waiting_lane(WaitingLane *wl, ParkingLot *pl, char *license, int arrival_time)
{
int i;
if (is_empty_waiting_lane(wl)) {
printf("便道为空,%s不在便道内\n", license);
return;
}
// 查找车辆在便道中的位置
for (i = wl->front; i <= wl->rear; i++) {
if (strcmp(wl->cars[i].license, license) == 0) {
break;
}
}
if (i > wl->rear) {
printf("%s不在便道内\n", license);
return;
}
// 将该位置上的车辆出队列
for (; i < wl->rear; i++) {
wl->cars[i] = wl->cars[i + 1];
}
wl->rear--;
// 将该车辆进入停车场
enter_parking_lot(pl, license, arrival_time);
}
```
最后,我们可以编写一个简单的主函数来测试停车场管理系统。
```c
int main()
{
ParkingLot pl;
WaitingLane wl;
int command, arrival_time, leave_time;
char license[10];
init_parking_lot(&pl);
init_waiting_lane(&wl);
do {
printf("\n1. 车辆进入停车场\n");
printf("2. 车辆从停车场离开\n");
printf("3. 车辆进入便道\n");
printf("4. 车辆离开便道进入停车场\n");
printf("5. 退出\n");
printf("请输入命令:");
scanf("%d", &command);
switch (command) {
case 1:
printf("请输入车牌号和到达时间:");
scanf("%s%d", license, &arrival_time);
enter_parking_lot(&pl, license, arrival_time);
break;
case 2:
printf("请输入车牌号和离开时间:");
scanf("%s%d", license, &leave_time);
leave_parking_lot(&pl, license, leave_time);
break;
case 3:
printf("请输入车牌号和到达时间:");
scanf("%s%d", license, &arrival_time);
enter_waiting_lane(&wl, license, arrival_time);
break;
case 4:
printf("请输入车牌号和到达时间:");
scanf("%s%d", license, &arrival_time);
leave_waiting_lane(&wl, &pl, license, arrival_time);
break;
case 5:
printf("谢谢使用!\n");
break;
default:
printf("无效命令!\n");
break;
}
} while (command != 5);
return 0;
}
```
这个停车场管理系统可以满足您的需求,但是它还有很多可以优化的地方,比如增加错误处理、使用链式存储结构等等。希望这个实现能对您有所帮助!