C语言停车场管理系统:基于栈和队列的数据结构设计
C语言停车场管理系统:基于栈和队列的数据结构设计
本项目使用C语言实现了一个停车场管理系统,利用栈和队列数据结构进行车辆管理,包含车辆到达、离开、显示等功能。代码模块化设计,每个功能模块使用函数实现。
1. 系统功能分析与数据结构定义
系统主要功能包括:
- 车辆到达: 当车辆到达停车场时,判断停车场是否已满,若满则将车辆加入便道等待队列;否则将车辆加入停车场栈。
- 车辆离开: 当车辆离开停车场时,从停车场栈中弹出车辆信息,若便道有等待车辆,则将便道中的首辆车加入停车场栈。
- 显示停车场车辆: 显示停车场中所有车辆信息。
- 显示便道上车辆: 显示便道上所有等待车辆信息。
定义以下数据结构:
- Car: 表示一辆车,包含车牌号和到达时间信息。
- Park: 表示停车场,使用栈数据结构实现。
- Waiting: 表示便道,使用队列数据结构实现。
2. 栈和队列基础操作代码实现
分别实现栈和队列的以下基础操作函数:
- 初始化栈/队列
- 判断栈/队列是否为空
- 判断栈/队列是否已满
- 入栈/入队操作
- 出栈/出队操作
3. 系统功能模块实现
(1)车辆到达模块: push_park() 和 push_waiting() 函数分别实现将车辆加入停车场和便道队列。
(2)车辆离开模块: pop_park() 和 pop_waiting() 函数分别实现车辆离开停车场和便道。
(3)显示停车场车辆模块: display_park() 函数实现显示停车场车辆信息。
(4)显示便道上车辆模块: display_waiting() 函数实现显示便道车辆信息。
4. 系统主界面设计
设计一个菜单界面,用户可以选择相应功能进行操作。
代码示例
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10 // 停车场最大容量
#define MAX_WAITING 5 // 便道最大容量
typedef struct {
char license[10]; // 车牌号
int arrive_time; // 到达时间
} Car;
typedef struct {
Car data[MAX_SIZE];
int top; // 栈顶指针
} Park;
typedef struct {
Car data[MAX_WAITING];
int front, rear; // 队头和队尾指针
} Waiting;
void init_park(Park *p) {
p->top = -1;
}
void init_waiting(Waiting *w) {
w->front = w->rear = 0;
}
int is_park_full(Park *p) {
return p->top == MAX_SIZE - 1;
}
int is_waiting_full(Waiting *w) {
return (w->rear + 1) % MAX_WAITING == w->front;
}
int is_park_empty(Park *p) {
return p->top == -1;
}
int is_waiting_empty(Waiting *w) {
return w->front == w->rear;
}
void push_park(Park *p, Car c) {
if (is_park_full(p)) {
printf('停车场已满,无法停车!\n');
return;
}
p->top++;
p->data[p->top] = c;
printf('车辆 %s 已停入停车场,停车位编号为 %d。\n', c.license, p->top + 1);
}
void push_waiting(Waiting *w, Car c) {
if (is_waiting_full(w)) {
printf('便道已满,无法停车!\n');
return;
}
w->data[w->rear] = c;
w->rear = (w->rear + 1) % MAX_WAITING;
printf('车辆 %s 已停入便道,排队编号为 %d。\n', c.license, w->rear);
}
Car pop_park(Park *p, char *license) {
if (is_park_empty(p)) {
printf('停车场无车辆,无法离开!\n');
Car empty_car = {'', 0};
return empty_car;
}
Car c = p->data[p->top];
p->top--;
*license = c.license[0];
printf('车辆 %s 已离开停车场,停车费用为 %d 元。\n', c.license, (int)(rand() / (double)RAND_MAX * 100));
return c;
}
Car pop_waiting(Waiting *w, char *license) {
if (is_waiting_empty(w)) {
printf('便道无车辆,无法离开!\n');
Car empty_car = {'', 0};
return empty_car;
}
Car c = w->data[w->front];
w->front = (w->front + 1) % MAX_WAITING;
*license = c.license[0];
printf('车辆 %s 已离开便道,进入停车场,停车位编号为 %d。\n', c.license, w->front);
return c;
}
void display_park(Park *p) {
if (is_park_empty(p)) {
printf('停车场无车辆!\n');
return;
}
printf('停车场车辆如下:\n');
for (int i = p->top; i >= 0; i--) {
printf('停车位编号:%d,车牌号:%s,到达时间:%d\n', i + 1, p->data[i].license, p->data[i].arrive_time);
}
}
void display_waiting(Waiting *w) {
if (is_waiting_empty(w)) {
printf('便道无车辆!\n');
return;
}
printf('便道车辆如下:\n');
for (int i = w->front; i != w->rear; i = (i + 1) % MAX_WAITING) {
printf('排队编号:%d,车牌号:%s,到达时间:%d\n', i + 1, w->data[i].license, w->data[i].arrive_time);
}
}
int main() {
Park p;
Waiting w;
init_park(&p);
init_waiting(&w);
int choice;
do {
printf('停车场管理系统\n');
printf('1. 车辆到达\n');
printf('2. 车辆离开\n');
printf('3. 显示停车场车辆\n');
printf('4. 显示便道上车辆\n');
printf('0. 退出系统\n');
printf('请选择功能:');
scanf('%d', &choice);
switch (choice) {
case 1: {
Car c;
printf('请输入车牌号:');
scanf('%s', c.license);
c.arrive_time = rand() % 24;
if (is_park_full(&p)) {
push_waiting(&w, c);
} else {
push_park(&p, c);
}
break;
}
case 2: {
char license;
Car c = pop_park(&p, &license);
if (c.license[0] != '\0') {
if (!is_waiting_empty(&w)) {
Car new_c = pop_waiting(&w, &license);
push_park(&p, new_c);
}
}
break;
}
case 3: {
display_park(&p);
break;
}
case 4: {
display_waiting(&w);
break;
}
case 0: {
printf('感谢使用停车场管理系统!\n');
break;
}
default: {
printf('输入有误,请重新输入!\n');
break;
}
}
} while (choice != 0);
return 0;
}
总结
本项目通过实现一个简单的停车场管理系统,展示了如何利用栈和队列数据结构解决实际问题。该系统代码结构清晰,易于理解和维护。用户可以根据需要扩展系统功能,例如增加停车费用计算、车辆类型管理等功能。
原文地址: https://www.cveoy.top/t/topic/jjYq 著作权归作者所有。请勿转载和采集!