C语言停车场管理系统:基于栈和队列的数据结构设计
C语言停车场管理系统:基于栈和队列的数据结构设计
本项目使用结构化程序设计方法和 C 语言,利用栈和队列数据结构实现一个停车场管理系统。系统包含车辆到达、离开、查看停车场和便道车辆等功能,并使用函数进行模块化设计,提高代码可读性和可维护性。
1. 系统功能分析与数据结构定义
本系统主要功能如下:
- 车辆到达模块: 当车辆到达时,系统将车辆信息(车牌号和到达时间)压入停车场栈。如果停车场已满,则将车辆信息压入便道队列。
- 车辆离开模块: 当车辆离开时,系统从停车场栈中弹出该车辆信息,并根据其离开时间计算停车时间。如果该车辆在便道队列中,则将其从队列中取出并压入停车场栈。
- 显示停车场车辆: 显示当前停车场中所有车辆的信息,包括车牌号和停车时间。
- 显示便道上车辆: 显示当前便道上所有车辆的信息,包括车牌号和到达时间。
系统使用以下数据结构:
- 车辆结构体: 用于存储车辆信息,包括车牌号和到达时间。
- 栈结构体: 用于模拟停车场,使用栈的先进后出特性。
- 队列结构体: 用于模拟便道,使用队列的先进先出特性。
2. 代码实现
#include <stdio.h>
#include <stdlib.h>
// 定义车辆结构体
typedef struct {
int num; // 车牌号
int time; // 到达时间
} Car;
// 定义栈结构体
typedef struct {
Car *base; // 栈底指针
Car *top; // 栈顶指针
int stacksize; // 栈的大小
} Stack;
// 定义队列结构体
typedef struct {
Car *base; // 队列指针
int front; // 队头指针
int rear; // 队尾指针
int queuesize; // 队列大小
} Queue;
// 初始化栈
void InitStack(Stack *s, int size) {
s->base = (Car *)malloc(size * sizeof(Car));
s->top = s->base;
s->stacksize = size;
}
// 判断栈是否为空
int StackEmpty(Stack *s) {
return s->top == s->base;
}
// 判断栈是否已满
int StackFull(Stack *s) {
return s->top - s->base == s->stacksize;
}
// 进栈
void Push(Stack *s, Car c) {
if (StackFull(s)) {
printf('停车场已满,无法停车\n');
return;
}
*(s->top) = c;
s->top++;
}
// 出栈
void Pop(Stack *s, Car *c) {
if (StackEmpty(s)) {
printf('停车场已空,无车辆出库\n');
return;
}
s->top--;
*c = *(s->top);
}
// 初始化队列
void InitQueue(Queue *q, int size) {
q->base = (Car *)malloc(size * sizeof(Car));
q->front = q->rear = 0;
q->queuesize = size;
}
// 判断队列是否为空
int QueueEmpty(Queue *q) {
return q->front == q->rear;
}
// 判断队列是否已满
int QueueFull(Queue *q) {
return (q->rear + 1) % q->queuesize == q->front;
}
// 入队
void EnQueue(Queue *q, Car c) {
if (QueueFull(q)) {
printf('便道已满,无法停车\n');
return;
}
q->base[q->rear] = c;
q->rear = (q->rear + 1) % q->queuesize;
}
// 出队
void DeQueue(Queue *q, Car *c) {
if (QueueEmpty(q)) {
printf('便道已空,无车辆出库\n');
return;
}
*c = q->base[q->front];
q->front = (q->front + 1) % q->queuesize;
}
// 车辆到达模块
void Arrive(Stack *s, Queue *q) {
Car c;
printf('请输入车牌号和到达时间:');
scanf('%d%d', &c.num, &c.time);
Push(s, c);
printf('车辆已停入停车场\n');
}
// 车辆离开模块
void Leave(Stack *s, Queue *q) {
Car c;
printf('请输入车牌号和离开时间:');
scanf('%d%d', &c.num, &c.time);
while (!StackEmpty(s)) {
Pop(s, &c);
if (c.num == num) {
printf('车辆已离开停车场,停车时间为%d小时\n', time - c.time);
while (!QueueEmpty(q)) {
DeQueue(q, &c);
Push(s, c);
}
return;
} else {
EnQueue(q, c);
}
}
printf('停车场中无此车辆\n');
}
// 显示停车场车辆
void DisplayStack(Stack *s) {
if (StackEmpty(s)) {
printf('停车场为空\n');
return;
}
printf('停车场车辆如下:\n');
Car *p = s->top;
while (p > s->base) {
p--;
printf('车牌号:%d,停车时间:%d小时\n', p->num, time - p->time);
}
}
// 显示便道上车辆
void DisplayQueue(Queue *q) {
if (QueueEmpty(q)) {
printf('便道上无车辆\n');
return;
}
printf('便道上车辆如下:\n');
int i = q->front;
while (i != q->rear) {
printf('车牌号:%d,到达时间:%d\n', q->base[i].num, q->base[i].time);
i = (i + 1) % q->queuesize;
}
}
int main() {
Stack s;
Queue q;
int size;
printf('请输入停车场大小和便道大小:');
scanf('%d%d', &size, &q.queuesize);
InitStack(&s, size);
InitQueue(&q, q.queuesize);
int choice;
while (1) {
printf('\n请选择功能:\n');
printf('1. 车辆到达\n');
printf('2. 车辆离开\n');
printf('3. 显示停车场车辆\n');
printf('4. 显示便道上车辆\n');
printf('5. 退出程序\n');
scanf('%d', &choice);
switch (choice) {
case 1:
Arrive(&s, &q);
break;
case 2:
Leave(&s, &q);
break;
case 3:
DisplayStack(&s);
break;
case 4:
DisplayQueue(&q);
break;
case 5:
return 0;
default:
printf('输入有误,请重新输入\n');
}
}
}
3. 系统主界面
系统主界面提供一个菜单,用户可以通过选择对应数字进入相应功能模块。
4. 代码说明
代码中使用了以下函数:
- InitStack(): 初始化栈
- StackEmpty(): 判断栈是否为空
- StackFull(): 判断栈是否已满
- Push(): 进栈
- Pop(): 出栈
- InitQueue(): 初始化队列
- QueueEmpty(): 判断队列是否为空
- QueueFull(): 判断队列是否已满
- EnQueue(): 入队
- DeQueue(): 出队
- Arrive(): 车辆到达模块
- Leave(): 车辆离开模块
- DisplayStack(): 显示停车场车辆
- DisplayQueue(): 显示便道上车辆
5. 总结
本项目使用结构化程序设计方法和 C 语言,利用栈和队列数据结构实现一个停车场管理系统,并使用函数进行模块化设计,提高代码可读性和可维护性。系统功能完善,可以满足基本停车场管理需求。
原文地址: https://www.cveoy.top/t/topic/jj0u 著作权归作者所有。请勿转载和采集!