停车场管理系统(C语言顺序栈+链栈+链队列)

一、实验目的

1.根据停车场管理系统的要求,利用结构化程序设计方法以及C的编程思想来完成系统的设计,使用数据结构中的栈、队列进行分析;

2.按功能定义函数或书写多个文件,进行模块化设计,各个功能模块用函数的形式来实现;

3.通过对参考代码的运行与调试,并且对以核心功能模块代码进行注释,真正掌握算法的思路与实现步骤。

二、实验内容

1.设计系统主界面,要求选择菜单对应数字进入相应功能:

2.要求对以下各个功能模块进行算法设计;

(1)车辆到达模块;

(2)车辆离开模块;

(3)列表显示模块;


Dec C++和VS编译器创建项目都要创建C++项目:
 VS:VS2019如何创建C++项目?_Gemini-zero的博客-CSDN博客_vs2019怎么创建c++项目打开VS2019,选择空项目后,点击下一步(如果没有找到空项目,说明你下载的时候没勾选C++模块)输入项目名,更改项目存放路径后,选择下一步选择C++文件,修改程序名称,点击添加找到“解决方案资源管理器”,右键点击源文件,选择添加新建项此时可以开始编写C++程序了...https://blog.csdn.net/qq_44364832/article/details/105820626Dec c++: https://jingyan.baidu.com/article/fd8044fae80db55031137a07.htmlhttps://jingyan.baidu.com/article/fd8044fae80db55031137a07.html


这是我的vs框架

停车场管理系统(C语言顺序栈+链栈+链队列)_第1张图片


1、车辆到达模块流程图:

停车场管理系统(C语言顺序栈+链栈+链队列)_第2张图片

2、车辆离开模块流程图:

停车场管理系统(C语言顺序栈+链栈+链队列)_第3张图片


 功能截图:

停车场管理系统(C语言顺序栈+链栈+链队列)_第4张图片

 停车场管理系统(C语言顺序栈+链栈+链队列)_第5张图片

 停车场管理系统(C语言顺序栈+链栈+链队列)_第6张图片

 停车场管理系统(C语言顺序栈+链栈+链队列)_第7张图片

 停车场管理系统(C语言顺序栈+链栈+链队列)_第8张图片

 停车场管理系统(C语言顺序栈+链栈+链队列)_第9张图片

 停车场管理系统(C语言顺序栈+链栈+链队列)_第10张图片

 停车场管理系统(C语言顺序栈+链栈+链队列)_第11张图片

 停车场管理系统(C语言顺序栈+链栈+链队列)_第12张图片

 停车场管理系统(C语言顺序栈+链栈+链队列)_第13张图片

 停车场管理系统(C语言顺序栈+链栈+链队列)_第14张图片

 停车场管理系统(C语言顺序栈+链栈+链队列)_第15张图片

 停车场管理系统(C语言顺序栈+链栈+链队列)_第16张图片


 创建头文件 struct.h 定义数据类型和存储结构

#pragma once

#ifndef __STRUCT_H__
#define __STRUCT_H__

#define MAX 3 //车位数
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define Xtime 30 //30分钟Xprice块钱
#define Xprice 1 //Xtime分钟一块钱
#define Etime 0 //前5分钟免费
typedef int Status;

// 车辆信息
typedef struct {
	char num[10];  	// 车牌 
	long reach;   	// 车辆到达时间 
	long leave;   	// 车辆离开时间 
}Car;

// 车辆顺序栈:停车场Enter和临时停车Temp 
typedef struct {
	Car* top;
	Car* base;
	int stacksize;//栈可用的最大容量
}SqStack;

//链栈(临时)
typedef struct StackNode {
	Car data;
	struct StackNode* next;
}StackNode,*LinkStack;

// 便道停车wait队列的结点 
typedef struct QNode {
	Car data;
	QNode* next;
}QNode, * QueuePtr;

// 便道停车链式队列 
typedef struct {
	QueuePtr front; //队头指针
	QueuePtr rear; //队尾指针
}LinkQueue;

#endif

创建 function_declare.h 头文件把所有的方法函数声明

#pragma once

#ifndef __FUNCTION_H__
#define __FUNCTION_H__

void SelectAll(SqStack S, LinkQueue Q);//查看车库

Status InitTempStack(LinkStack& TempStack); //初始化临时栈
Status InitStack(SqStack & S);		// 初始化车辆栈
Status Push(SqStack& S, Car e);	// 车辆进栈
Status Pop(SqStack& S, Car& e, LinkStack& TempStack);	// 车辆出栈
Car GetTop(SqStack& S);	// 取栈顶元素
int StackEmpty(SqStack S);	// 车辆栈判空
int StackFull(SqStack S, Car e);	// 车辆栈判满

Status InitQueue(LinkQueue & Q);		// 初始化车辆链式队列
Status EnQueue(LinkQueue& Q, Car e);	// 车辆入队
Car DeQueue(LinkQueue& Q); 	// 车辆出队
Car GetHead(LinkQueue Q); 	// 取链队的对头元素
int QueueEmpty(LinkQueue Q); 	// 车辆队列判空

#endif

创建 caroperation.cpp 源文件编写系统的功能

#include 
#include
#include 
#include
#include "struct.h"

//时间换算(传入秒)
void TimeExpress(int time) {
    int min;
    int hour;
    int sec;
    if (time < 60) {
        printf("停车时长: %d 秒\n", time);
    }
    else if (time < 3600) {
        min = time / 60;
        sec = time % 60;
        if (time % 60 == 0) {
            printf("停车时长: %d 分钟\n", min);
        }
        else {
            printf("停车时长: %d 分钟 % d 秒\n", min , sec);
        }
    }
    else {
        min = time / 60;
        sec = time % 60;
        hour = min / 60;
        min %= 60;
        if (sec == 0 && min == 0) {
            printf("停车时长: %d 小时\n", hour);
        }
        else if(sec != 0 && min == 0){
            printf("停车时长: %d 小时 0 分钟 %d 秒\n", hour,sec);
        }
        else if (sec == 0 && min != 0) {
            printf("停车时长: %d 小时 %d 分钟\n", hour, min);
        }
        else if (sec != 0 && min != 0) {
            printf("停车时长: %d 小时 %d 分钟 %d 秒\n", hour,min, sec);
        }
    }
}

//前Etime分钟免费,费用Xtime分钟Xprice块钱,不到Xtime分钟按Xtime分钟算
//传入的time单位为分钟
int price(int time) {
    int price;
    if (time <= Etime)return 0;
    else {
        price = time / Xtime;
        if (time % Xtime != 0)price++;
        return price;
    }
}

// 车辆栈判空
int StackEmpty(SqStack S) {
    if (S.top == S.base) {
        printf("当前车库没有车辆!\n\a");
        return ERROR;
    }
    else {
        return OK;
    }
}

//查看车库
void SelectAll(SqStack S, LinkQueue Q) {
    if (StackEmpty(S)) {
        QueuePtr q=Q.front;
        printf("========车库========\n");
        while (S.top != S.base)
        {
            S.top--;
            printf("|%s|\n", S.top->num);
        }
        printf("=======等待区=======\n");
        printf("-------------------------\n");
        if (q == Q.rear) {
            printf("暂无车辆等待...");
        }
        else {
            while (q != Q.rear) {
                q = q->next;
                printf("%s ",q->data.num);
            }
        }
        printf("\n-------------------------\n");
    }
}

// 初始化车辆栈
Status InitStack(SqStack& S) {
    S.base = new Car[MAX];
    if (!S.base)exit(OVERFLOW);
    S.top = S.base;
    S.stacksize = MAX;
    return OK;
}

//初始化临时栈
Status InitTempStack(LinkStack &TempStack) {
    TempStack = NULL;
    return OK;
}

// 车辆栈判满
int StackFull(SqStack S,Car e) {
    if (S.top - S.base == MAX) {
        //printf("车库满了!\a\n");
        printf("车位已满 ==> 车牌号 %s 进入等待区!\a\n", e.num);
        return ERROR;
    }
    else {
        return OK;
    }
}

// 车辆进栈
Status Push(SqStack& S, Car e) {
    
    if (StackFull(S,e)) {
        *S.top++ = e;
        printf("车牌号 %s 成功进库!\n",e.num);
        printf("车位剩余:%d \n", --S.stacksize);
        return OK;
    }
    //等待队列 
    return ERROR;
}

// 取栈顶元素
Car GetTop(SqStack& S) {
    return *--S.top;
}

//判断有没有该车辆
Status Find(SqStack S,Car e) {
    while (S.top != S.base)
    {
        S.top--;
        if (!strcmp(S.top->num, e.num)) {
            return OK;
        }
    }
    return ERROR;
}

// 链栈入栈(临时)
Status TempPush(LinkStack& TempStack,Car e) {
    LinkStack p = new StackNode;
    p->data = e;
    p->next = TempStack;
    TempStack = p;
    return OK;
}

// 链栈出栈(临时)
Car TempPop(LinkStack& TempStack) {
    /*if (TempStack == NULL) {
        printf("临时栈空\a\n");
        return ERROR;
    }*/
    LinkStack p;
    Car tempData;
    tempData = TempStack->data;
    p = TempStack;
    TempStack = TempStack->next;
    delete(p);
    return tempData;
}

// 车辆出栈
Status Pop(SqStack& S, Car& e, LinkStack& TempStack) {
    //是否空栈
    if (StackEmpty(S)) { 
        //判断有没有该车
        if (!Find(S,e)) {
            printf("该车不在车库中!\a\n");
            return ERROR;
        }
        Car temp;
        while (true)
        {
            temp = GetTop(S);
            if (!strcmp(temp.num, e.num)) {
                printf("车牌号 %s 成功出库!\n", e.num);
                //时间(出库时间)
                e.leave = time(NULL);
                //计费(传入分钟单位)
                int pay=price((e.leave - e.reach)/60);
                //出临时栈&进原栈(给车让位进另一个栈又出栈进回原栈)
                while (TempStack != NULL) {
                    *S.top++ = TempPop(TempStack);
                }
                //时间换算并输出时间
                TimeExpress(e.leave - e.reach);
                printf("请缴费 %d 元\n", pay);
                printf("车位剩余:%d \n", ++S.stacksize);
                return OK;
            }
            //进栈(让位的车进临时栈)
            TempPush(TempStack, temp);
        }
    }
    return ERROR;
}

// 初始化车辆链式队列
Status InitQueue(LinkQueue& Q) {
    Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
    if (!Q.front)return ERROR;
    else {
        Q.front->next = NULL;
        return OK;
    }
}

// 车辆队列判空
int QueueEmpty(LinkQueue Q) {
    if (Q.front == Q.rear) {
        //printf("队空!\n\a");
        return ERROR;
    }return OK;
}

// 取链队的对头元素
Car GetHead(LinkQueue Q) {
    return Q.front->next->data;
}

// 车辆入队
Status EnQueue(LinkQueue& Q, Car e) {
    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
    if (!p) {
        printf("程序发生不可逆的错误,请联系管理员!\n\a");
        //printf("入队失败!\a\n");
        return ERROR;
    }
    else {
        p->data = e;
        p->next = NULL;
        Q.rear->next = p;
        Q.rear = p;
        return OK;
    }
}

// 车辆出队
Car DeQueue(LinkQueue& Q) {
    QueueEmpty(Q);
    Car HeadCar=GetHead(Q);
    QueuePtr p;
    p = Q.front->next;
    Q.front->next = p->next;
    if (Q.rear == p)Q.rear = Q.front;
    free(p);
    return HeadCar;
}

创建主函数 main.cpp 源文件编写界面并执行程序

#include
#include
#include
#include
#include"struct.h"
#include"function_declare.h"

int main() {
	SqStack S;
	LinkStack TempStack;
	LinkQueue Q;
	Car ReadyCar;
	Car e;
	int item;

	//栈初始化
	if (!InitStack(S)) {
		printf("程序发生不可逆的错误,请联系管理员!\n\a");
		return ERROR;
		system("pause");
	}
	//临时栈初始化
	InitTempStack(TempStack);
	//队列初始化
	if (!InitQueue(Q)) {
		printf("程序发生不可逆的错误,请联系管理员!\n\a");
		return ERROR;
		system("pause");
	}
	
	MARK:
	while (1) {
		printf("*****欢迎使用停车场系统*****\n");
		printf("①车辆到达模块\n");
		printf("②车辆离开模块\n");
		printf("③列表显示模块\n");
		printf("④极致可视化\n");
		printf("⑤退出\n");
		printf("请选择功能: ");
		scanf("%d", &item);
		printf("-----------------\n");
		switch (item)
		{

		case 1: {
			printf("车牌号为:");
			getchar();
			scanf("%s", &e.num);
			//时间计费(入库开始时间)
			e.reach = time(NULL);
			if (!Push(S,e)) {
				EnQueue(Q,e);
			}
			printf("\n\n");
			break;
		}
		case 2: {
			printf("输入要出库的车牌号:");
			getchar();
			scanf("%s", &e.num);
			if (Pop(S, e, TempStack)) {
				if (QueueEmpty(Q)) {
					//出队进栈
					ReadyCar = DeQueue(Q);
					ReadyCar.reach = time(NULL);
					Push(S, ReadyCar);
				}
			}
			printf("\n\n");
			break;
		}
		case 3: {
			SelectAll(S,Q);
			printf("\n\n");
			break;
		}
		case 4: {
			system("cls");
			while (1) {
				printf("*****极致可视化模式*****\n");
				printf("①车辆到达模块\n");
				printf("②车辆离开模块\n");
				printf("③列表显示模块\n");
				printf("④退出极致可视化模式\n");
				printf("请选择功能: ");
				scanf("%d", &item);
				printf("-----------------\n");
				switch (item)
				{

				case 1: {
					printf("车牌号为:");
					getchar();
					scanf("%s", &e.num);
					system("cls");
					//时间计费(入库开始时间)
					e.reach = time(NULL);
					if (!Push(S, e)) {
						EnQueue(Q, e);
					}
					printf("\n");
					SelectAll(S, Q);
					break;
				}
				case 2: {
					printf("输入要出库的车牌号:");
					getchar();
					scanf("%s", &e.num);
					system("cls");
					if (Pop(S, e, TempStack)) {
						if (QueueEmpty(Q)) {
							//出队进栈
							ReadyCar = DeQueue(Q);
							ReadyCar.reach = time(NULL);
							Push(S, ReadyCar);
						}
					}
					printf("\n");
					SelectAll(S, Q);
					break;
				}
				case 3: {
					system("cls");
					SelectAll(S, Q);
					printf("\n\n");
					break;
				}
				case 4:
					system("cls");
					goto MARK;
					break;
				default:printf("错误:输入正确的功能序号!\a\n");
					break;
				}
			}
			break;
		}
		case 5:
			return 0;
			system("pause");
		default:printf("错误:输入正确的功能序号!\a\n");
			break;
		}
	}
	return 0;
}

资源:

停车场管理系统(C语言顺序栈+链栈+链队列)-C++文档类资源-CSDN下载停车场管理系统(C语言车库顺序栈+临时栈链栈+排队车道链队列)更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/weixin_55797565/85183518


如果有用的话可以给一个小赞吗

你可能感兴趣的:(数据结构,C语言,算法,数据结构,c++,算法)