C语言停车场管理系统:基于栈和队列的数据结构设计

本项目使用结构化程序设计方法和 C 语言,利用栈和队列数据结构实现一个停车场管理系统。系统包含车辆到达、离开、查看停车场和便道车辆等功能,并使用函数进行模块化设计,提高代码可读性和可维护性。

1. 系统功能分析与数据结构定义

本系统主要功能如下:

  1. 车辆到达模块: 当车辆到达时,系统将车辆信息(车牌号和到达时间)压入停车场栈。如果停车场已满,则将车辆信息压入便道队列。
  2. 车辆离开模块: 当车辆离开时,系统从停车场栈中弹出该车辆信息,并根据其离开时间计算停车时间。如果该车辆在便道队列中,则将其从队列中取出并压入停车场栈。
  3. 显示停车场车辆: 显示当前停车场中所有车辆的信息,包括车牌号和停车时间。
  4. 显示便道上车辆: 显示当前便道上所有车辆的信息,包括车牌号和到达时间。

系统使用以下数据结构:

  • 车辆结构体: 用于存储车辆信息,包括车牌号和到达时间。
  • 栈结构体: 用于模拟停车场,使用栈的先进后出特性。
  • 队列结构体: 用于模拟便道,使用队列的先进先出特性。

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 语言,利用栈和队列数据结构实现一个停车场管理系统,并使用函数进行模块化设计,提高代码可读性和可维护性。系统功能完善,可以满足基本停车场管理需求。

C语言停车场管理系统:基于栈和队列的数据结构设计

原文地址: https://www.cveoy.top/t/topic/jj0u 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录