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;
}

总结

本项目通过实现一个简单的停车场管理系统,展示了如何利用栈和队列数据结构解决实际问题。该系统代码结构清晰,易于理解和维护。用户可以根据需要扩展系统功能,例如增加停车费用计算、车辆类型管理等功能。

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

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

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