用c语言 写停车场管理系统 利用栈和队列 栈是车库 队列是便道 同时加一个让路栈当栈底的车出库 其他不需要出库的车放入让路栈 需要自动记录车的进出时间,自动收费,车辆进入,车辆离开,查看停车场内车辆信息,便道内车辆信息等 停车场内有五个车位
时间: 2024-03-14 07:47:31 浏览: 106
停车场管理(以栈模拟停车场,以队列模拟停车场外的便道)
5星 · 资源好评率100%
好的,这是一个比较复杂的问题,需要涉及到栈、队列、时间、收费等多方面的内容。以下是一个简单的停车场管理系统设计:
1. 定义车辆结构体,包含车牌号、进入时间和离开时间等信息。
```c
typedef struct {
char plate_number[20]; // 车牌号
time_t enter_time; // 进入时间
time_t leave_time; // 离开时间
int charge; // 收费
} Car;
```
2. 定义栈和队列结构体,分别表示停车场和便道。
```c
#define MAX_SIZE 5
typedef struct {
Car cars[MAX_SIZE]; // 车库数组
int top; // 栈顶指针
} Stack;
typedef struct {
Car cars[MAX_SIZE]; // 便道数组
int front; // 队首指针
int rear; // 队尾指针
} Queue;
```
3. 定义让路栈结构体,表示需要出库的车辆所在的栈。
```c
typedef struct {
Car cars[MAX_SIZE]; // 让路栈数组
int top; // 栈顶指针
} LetWayStack;
```
4. 定义函数实现车辆进入停车场、车辆从停车场离开、车辆进入便道、车辆从便道进入停车场等功能。
```c
void enter_parking_lot(Stack *parking_lot, Queue *waiting_queue, Car car) {
if (parking_lot->top < MAX_SIZE) {
parking_lot->top++;
parking_lot->cars[parking_lot->top] = car;
} else {
if (waiting_queue->rear - waiting_queue->front < MAX_SIZE) {
waiting_queue->rear++;
waiting_queue->cars[waiting_queue->rear] = car;
} else {
printf("停车场已满,无法进入!\n");
}
}
}
void leave_parking_lot(Stack *parking_lot, LetWayStack *let_way_stack, char *plate_number) {
int i;
Car temp_car;
for (i = parking_lot->top; i >= 1; i--) {
if (strcmp(parking_lot->cars[i].plate_number, plate_number) == 0) {
temp_car = parking_lot->cars[i];
parking_lot->top--;
break;
} else {
let_way_stack->top++;
let_way_stack->cars[let_way_stack->top] = parking_lot->cars[i];
parking_lot->top--;
}
}
while (let_way_stack->top > 0) {
parking_lot->top++;
parking_lot->cars[parking_lot->top] = let_way_stack->cars[let_way_stack->top];
let_way_stack->top--;
}
printf("车辆%s已离开停车场!\n", temp_car.plate_number);
}
void enter_waiting_queue(Queue *waiting_queue, Car car) {
if (waiting_queue->rear - waiting_queue->front < MAX_SIZE) {
waiting_queue->rear++;
waiting_queue->cars[waiting_queue->rear] = car;
printf("车辆%s已进入便道!\n", car.plate_number);
} else {
printf("便道已满,无法进入!\n");
}
}
void enter_parking_lot_from_waiting_queue(Queue *waiting_queue, Stack *parking_lot) {
if (parking_lot->top < MAX_SIZE) {
parking_lot->top++;
parking_lot->cars[parking_lot->top] = waiting_queue->cars[waiting_queue->front + 1];
waiting_queue->front++;
printf("车辆%s已进入停车场!\n", parking_lot->cars[parking_lot->top].plate_number);
} else {
printf("停车场已满,无法进入!\n");
}
}
```
5. 定义函数实现收费。
```c
int calculate_charge(Car car) {
int duration = (int)difftime(car.leave_time, car.enter_time) / 60;
return duration * 2;
}
```
6. 定义函数实现查看停车场内车辆信息和便道内车辆信息。
```c
void print_parking_lot(Stack parking_lot) {
int i;
printf("停车场内车辆信息:\n");
for (i = parking_lot.top; i >= 1; i--) {
printf("车牌号:%s 进入时间:%s\n", parking_lot.cars[i].plate_number, ctime(&parking_lot.cars[i].enter_time));
}
}
void print_waiting_queue(Queue waiting_queue) {
int i;
printf("便道内车辆信息:\n");
for (i = waiting_queue.front + 1; i <= waiting_queue.rear; i++) {
printf("车牌号:%s 进入时间:%s\n", waiting_queue.cars[i].plate_number, ctime(&waiting_queue.cars[i].enter_time));
}
}
```
7. 主函数中实现具体逻辑,包括输入车辆信息、调用相应函数实现各种操作等。
```c
int main() {
Stack parking_lot;
parking_lot.top = 0;
Queue waiting_queue;
waiting_queue.front = 0;
waiting_queue.rear = 0;
LetWayStack let_way_stack;
let_way_stack.top = 0;
while (1) {
int option;
printf("请选择操作:\n1. 车辆进入停车场\n2. 车辆离开停车场\n3. 车辆进入便道\n4. 车辆从便道进入停车场\n5. 查看停车场内车辆信息\n6. 查看便道内车辆信息\n7. 退出程序\n");
scanf("%d", &option);
switch (option) {
case 1: {
Car car;
printf("请输入车牌号:\n");
scanf("%s", car.plate_number);
car.enter_time = time(NULL);
car.leave_time = 0;
car.charge = 0;
enter_parking_lot(&parking_lot, &waiting_queue, car);
break;
}
case 2: {
char plate_number[20];
printf("请输入车牌号:\n");
scanf("%s", plate_number);
int i;
for (i = parking_lot.top; i >= 1; i--) {
if (strcmp(parking_lot.cars[i].plate_number, plate_number) == 0) {
parking_lot.cars[i].leave_time = time(NULL);
parking_lot.cars[i].charge = calculate_charge(parking_lot.cars[i]);
leave_parking_lot(&parking_lot, &let_way_stack, plate_number);
break;
}
}
if (i == 0) {
printf("停车场内无此车辆!\n");
}
break;
}
case 3: {
Car car;
printf("请输入车牌号:\n");
scanf("%s", car.plate_number);
car.enter_time = time(NULL);
car.leave_time = 0;
car.charge = 0;
enter_waiting_queue(&waiting_queue, car);
break;
}
case 4: {
enter_parking_lot_from_waiting_queue(&waiting_queue, &parking_lot);
break;
}
case 5: {
print_parking_lot(parking_lot);
break;
}
case 6: {
print_waiting_queue(waiting_queue);
break;
}
case 7: {
return 0;
}
default: {
printf("输入错误,请重新输入!\n");
break;
}
}
}
}
```
这个停车场管理系统还可以进一步完善,比如增加管理员登录、多级收费、车位监控等功能。以上代码仅供参考,可能存在不足之处,欢迎指正和补充。
阅读全文