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

本项目使用C语言实现了一个停车场管理系统,运用数据结构中的栈和队列来模拟停车场和便道的车辆管理,并通过结构化程序设计方法和模块化设计,实现了车辆到达、离开、显示等功能。

系统功能分析

该停车场管理系统主要包含以下功能:

  1. 车辆到达模块:当车辆到达停车场时,系统会根据停车场的剩余空间将车辆停放到停车场或便道上。
  2. 车辆离开模块:当车辆离开停车场时,系统会根据车辆车牌号从停车场或便道上找到对应的车辆并将其删除。
  3. 显示停车场车辆:显示当前停车场内所有车辆的信息,包括车牌号、进入时间等。
  4. 显示便道上车辆:显示当前便道上所有车辆的信息,包括车牌号、进入时间等。

数据结构设计

本系统主要使用以下数据结构:

  1. Car结构体:用于存储车辆信息,包括车牌号'num'和进入时间'time'。
  2. Stack结构体:用于模拟停车场,使用栈来实现先进后出(FILO)的车辆管理。
  3. Queue结构体:用于模拟便道,使用队列来实现先进先出(FIFO)的车辆管理。

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define MAXSIZE 100 //停车场/便道容量
#define PARKSIZE 5 //停车场容量

typedef struct {
    char num[10]; //车牌号
    int time; //进入时间
} Car;

typedef struct {
    Car data[MAXSIZE];
    int top; //栈顶指针
} Stack;

typedef struct {
    Car data[MAXSIZE];
    int front; //队头指针
    int rear; //队尾指针
} Queue;

Stack park; //停车场栈
Queue road; //便道队列

// 初始化栈
void InitStack(Stack *s) {
    s->top = -1;
}

// 判断栈是否满
int IsFullStack(Stack *s) {
    if (s->top == PARKSIZE - 1)
        return 1;
    else
        return 0;
}

// 判断栈是否空
int IsEmptyStack(Stack *s) {
    if (s->top == -1)
        return 1;
    else
        return 0;
}

// 入栈
void Push(Stack *s, Car c) {
    if (IsFullStack(s))
        printf("停车场已满,无法停车!\n");
    else {
        s->top++;
        s->data[s->top] = c;
        printf("车辆%s已停在停车场第%d个位置!\n", c.num, s->top + 1);
    }
}

// 出栈
Car Pop(Stack *s) {
    Car c;
    if (IsEmptyStack(s)) {
        printf("停车场已空,无车辆出库!\n");
        c.num[0] = '\0';
        c.time = 0;
        return c;
    } else {
        c = s->data[s->top];
        s->top--;
        printf("车辆%s已从停车场出库!\n", c.num);
        return c;
    }
}

// 获取栈顶元素
Car GetTop(Stack *s) {
    Car c;
    if (IsEmptyStack(s)) {
        printf("停车场已空,无车辆!\n");
        c.num[0] = '\0';
        c.time = 0;
        return c;
    } else {
        c = s->data[s->top];
        return c;
    }
}

// 初始化队列
void InitQueue(Queue *q) {
    q->front = 0;
    q->rear = 0;
}

// 判断队列是否满
int IsFullQueue(Queue *q) {
    if ((q->rear + 1) % MAXSIZE == q->front)
        return 1;
    else
        return 0;
}

// 判断队列是否空
int IsEmptyQueue(Queue *q) {
    if (q->front == q->rear)
        return 1;
    else
        return 0;
}

// 入队
void EnQueue(Queue *q, Car c) {
    if (IsFullQueue(q))
        printf("便道已满,无法停车!\n");
    else {
        q->data[q->rear] = c;
        q->rear = (q->rear + 1) % MAXSIZE;
        printf("车辆%s已停在便道第%d个位置!\n", c.num, q->rear);
    }
}

// 出队
Car DeQueue(Queue *q) {
    Car c;
    if (IsEmptyQueue(q)) {
        printf("便道已空,无车辆出库!\n");
        c.num[0] = '\0';
        c.time = 0;
        return c;
    } else {
        c = q->data[q->front];
        q->front = (q->front + 1) % MAXSIZE;
        printf("车辆%s已从便道出库!\n", c.num);
        return c;
    }
}

// 获取队头元素
Car GetFront(Queue *q) {
    Car c;
    if (IsEmptyQueue(q)) {
        printf("便道已空,无车辆!\n");
        c.num[0] = '\0';
        c.time = 0;
        return c;
    } else {
        c = q->data[q->front];
        return c;
    }
}

// 车辆到达模块
void Arrive() {
    Car c;
    printf("请输入车牌号:");
    scanf("%s", c.num);
    c.time = time(NULL);
    if (!IsFullStack(&park))
        Push(&park, c);
    else
        EnQueue(&road, c);
}

// 车辆离开模块
void Leave() {
    Car c;
    printf("请输入车牌号:");
    scanf("%s", c.num);
    c.time = time(NULL);
    while (!IsEmptyStack(&park)) {
        if (strcmp(GetTop(&park).num, c.num) == 0) {
            Pop(&park);
            if (!IsEmptyQueue(&road)) {
                Push(&park, DeQueue(&road));
            }
            return;
        } else {
            EnQueue(&road, Pop(&park));
        }
    }
    printf("停车场和便道上均无此车辆!\n");
}

// 显示停车场车辆
void DisplayPark() {
    if (IsEmptyStack(&park))
        printf("停车场已空,无车辆!\n");
    else {
        printf("停车场车辆如下:\n");
        printf("车位\t车牌号\t\t进入时间\n");
        for (int i = park.top; i >= 0; i--)
            printf("%d\t%s\t\t%d\n", i + 1, park.data[i].num, park.data[i].time);
    }
}

// 显示便道上车辆
void DisplayRoad() {
    if (IsEmptyQueue(&road))
        printf("便道已空,无车辆!\n");
    else {
        printf("便道上车辆如下:\n");
        printf("位置\t车牌号\t\t进入时间\n");
        for (int i = road.front; i != road.rear; i = (i + 1) % MAXSIZE)
            printf("%d\t%s\t\t%d\n", i + 1, road.data[i].num, road.data[i].time);
    }
}

// 显示菜单
void DisplayMenu() {
    printf("停车场管理系统\n");
    printf("1.车辆到达\n");
    printf("2.车辆离开\n");
    printf("3.显示停车场车辆\n");
    printf("4.显示便道上车辆\n");
    printf("0.退出\n");
    printf("请输入操作序号:");
}

int main() {
    InitStack(&park);
    InitQueue(&road);
    int choice;
    do {
        DisplayMenu();
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                Arrive();
                break;
            case 2:
                Leave();
                break;
            case 3:
                DisplayPark();
                break;
            case 4:
                DisplayRoad();
                break;
            case 0:
                printf("退出停车场管理系统!\n");
                break;
            default:
                printf("输入有误,请重新选择!\n");
                break;
        }
    } while (choice != 0);
    return 0;
}

总结

本项目通过运用数据结构中的栈和队列,以及结构化程序设计方法和模块化设计,实现了功能完整的停车场管理系统。系统代码简洁易懂,可读性强,并包含详细的注释,便于理解和维护。

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

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

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