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

14 篇文章 0 订阅
12 篇文章 0 订阅

一、实验目的

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框架


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

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


 功能截图:

 

 

 

 

 

 

 

 

 

 

 

 


 创建头文件 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 <string.h>
#include<stdlib.h>
#include <stdio.h>
#include<time.h>
#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<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#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


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

  • 74
    点赞
  • 377
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
这个停车场管理系统是基于C语言数据结构中栈和队列思想的,以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码、到达或离去的时刻。这个系统的基本要求是要求以顺序栈模拟停车场,以链队列模拟便道。具体的算法思想如下: 1.车辆停入停车场的流程:首先判断停车场的车位是否停满。两种情况:(1)停满时此时后来的车辆只能停在走道上 (2)未停满时后来的车辆继续入栈。 2.车辆出站的思想。两种情况:(1)车辆在栈顶时,此时直接出栈而用不到辅助栈(2)车辆不在车顶时排在前面的车辆必须让位,此时它才能出栈,算法思想是首先根据输入的车牌号进行在栈中搜索,返还一个角标,根据角标来,找到出栈的车辆,这时前面的车辆入辅助栈,当循环的目标车辆时,这时不需要入辅助栈,直接出栈即可! 总体结构思路如下:这时车位停满的情况,若非栈顶出栈则需要把他前面的车让位进辅助栈,当目标车出栈的再回来。 以下是一个简单的栈和队列停车场管理系统C语言代码的范例,仅供参考: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 100 #define MAXCAR 20 #define PRICE 1 typedef struct{ char num[10]; int time; }Car; typedef struct{ Car stack[MAXSIZE]; int top; }Stack; typedef struct{ Car queue[MAXSIZE]; int front,rear; }Queue; Stack park; Queue road; void InitStack(Stack *s){ s->top=-1; } int IsFull(Stack *s){ if(s->top==MAXSIZE-1) return 1; else return 0; } int IsEmpty(Stack *s){ if(s->top==-1) return 1; else return 0; } void Push(Stack *s,Car c){ if(IsFull(s)){ printf("停车场已满!\n"); return; } s->top++; s->stack[s->top]=c; } Car Pop(Stack *s){ Car temp; if(IsEmpty(s)){ printf("停车场已空!\n"); temp.num[0]='\0'; temp.time=-1; return temp; } temp=s->stack[s->top]; s->top--; return temp; } void InitQueue(Queue *q){ q->front=q->rear=0; } int IsQueueFull(Queue *q){ if((q->rear+1)%MAXSIZE==q->front) return 1; else return 0; } int IsQueueEmpty(Queue *q){ if(q->front==q->rear) return 1; else return 0; } void InQueue(Queue *q,Car c){ if(IsQueueFull(q)){ printf("便道已满!\n"); return; } q->queue[q->rear]=c; q->rear=(q->rear+1)%MAXSIZE; } Car OutQueue(Queue *q){ Car temp; if(IsQueueEmpty(q)){ printf("便道已空!\n"); temp.num[0]='\0'; temp.time=-1; return temp; } temp=q->queue[q->front]; q->front=(q->front+1)%MAXSIZE; return temp; } void Arrive(){ Car temp; printf("请输入车牌号和到达时间:\n"); scanf("%s%d",temp.num,&temp.time); if(park.top<MAXCAR-1){ Push(&park,temp); printf("停车成功!\n"); } else{ InQueue(&road,temp); printf("停车场已满,停在便道上!\n"); } } void Leave(){ Car temp; int time,cost,i,flag=0; printf("请输入车牌号和离开时间:\n"); scanf("%s%d",temp.num,&time); while(!IsEmpty(&park)){ temp=Pop(&park); if(strcmp(temp.num,num)==0){ flag=1; cost=(time-temp.time)*PRICE; printf("停车时间为%d小时,应缴纳停车费%d元!\n",time-temp.time,cost); for(i=0;i<park.top;i++){ Push(&park,Pop(&park)); } return; } else{ Push(&road,temp); } } if(flag==0){ printf("未找到该车辆!\n"); return; } while(!IsEmpty(&road)){ Push(&park,OutQueue(&road)); } } void List(){ int i; if(IsEmpty(&park)){ printf("停车场为空!\n"); return; } printf("停车场:\n"); for(i=park.top;i>=0;i--){ printf("%s %d\n",park.stack[i].num,park.stack[i].time); } if(IsQueueEmpty(&road)){ printf("便道为空!\n"); return; } printf("便道:\n"); for(i=road.front;i!=road.rear;i=(i+1)%MAXSIZE){ printf("%s %d\n",road.queue[i].num,road.queue[i].time); } } int main(){ int choice; InitStack(&park); InitQueue(&road); while(1){ printf("停车场管理系统\n"); printf("1.车辆到达\n"); printf("2.车辆离开\n"); printf("3.显示车辆信息\n"); printf("4.退出系统\n"); printf("请输入操作编号:\n"); scanf("%d",&choice); switch(choice){ case 1:Arrive();break; case 2:Leave();break; case 3:List();break; case 4:exit(0); default:printf("输入有误,请重新输入!\n"); } } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

基础不扎实的计算机小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值