停车场管理(C语言版)

2024-04-14 11:38
文章标签 管理 语言版 停车场

本文主要是介绍停车场管理(C语言版),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      设停车场是一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北段),若停车厂内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车迹可开入;停车场内某辆车要离开时,在它之后进入的车连必须先退出车厂为它让路,待该车辆开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车时必须按它停留的时间长短缴纳费用。编写按上述要求进行管理的模拟程序。
      可以将停车场定义成一个顺序栈s0,便道定义成一个链队列q,而停车场中的某辆车要离开,则在它后面进停车场的车必须让道,让其离开,所以必须有一个临时的顺序栈s1,存放让道的车辆。
      当有车辆进停车场时,若栈s0不满,则直接进入栈s0;若栈s0满,则进入便道(链队列q)。若有s0中车辆x离开时,先让在x后面进栈的车从s0退栈并进入栈s1中,让x离开并收取停车费(在便道上停留的时间不收费),然后再把s1中所有元素退栈并重新进入s0栈,最后,将链队列q中的队头元素出队并进栈到s0中。

首先设计一个数据结构,在此小程序中用一个字符表示车辆,停放的时间用int类型,按照题目的要求,设计一个队列和栈如下所示。

typedef struct parkingNode{dataType car; int time_min;
}parkingNode,*parkingPmt; 
//存放车辆的一个顺序栈
typedef struct{parkingNode *base;parkingNode *top;int length;
}SqStack;typedef struct QNode{dataType data;QNode *next;
}QNode,*QueuePtr;
//存放临时车辆的队列
typedef struct{QueuePtr front;QueuePtr rear;
}LinkQueue; 

完整代码如下:

#include<iostream>
using namespace std;
#include<time.h>
#define MAXSIZE 5
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef char dataType;
typedef int Status;
typedef struct parkingNode{dataType car; int time_min;
}parkingNode,*parkingPmt; 
//存放车辆的一个顺序栈
typedef struct{parkingNode *base;parkingNode *top;int length;
}SqStack;typedef struct QNode{dataType data;QNode *next;
}QNode,*QueuePtr;
//存放临时车辆的队列
typedef struct{QueuePtr front;QueuePtr rear;
}LinkQueue; 
//初始化顺序栈(停车场通道和临时车道)
Status initSqStack(SqStack &S){S.base = new parkingNode[MAXSIZE];//MAXSIZE为停放车辆的最大数量if(!S.base) exit(OVERFLOW);S.top=S.base;S.length=0;return OK;
} 
//初始化链式队列(外面停放的车辆,便道) 
Status initLinkQueue(LinkQueue &L){L.front=L.rear=new QNode;L.rear->next=NULL;L.front->next=NULL;return OK;
}
//获取当前时间
int getTime(){time_t t;struct tm * lt;time(&t);//获取Unix时间戳。lt = localtime (&t);//转为时间结构。return lt->tm_min;
}
//判断是否停满
bool isParkingFull(SqStack S){return (S.top-S.base)==MAXSIZE?true:false;
}
//判断停车场是否是空的
bool isParkingEmpty(SqStack S){return (S.top==S.base)?true:false;
} 
//判断停车道是否已经有这个车辆
bool isExist(SqStack S,dataType car) {parkingNode *p=S.base;if(S.base==S.top)return 0;while(p->car!=car&&p!=S.top){p++;}return p!=S.top;
}
//开始停放车辆
Status parking(SqStack &S,LinkQueue &L,dataType car){if(isExist(S,car)){cout<<"停车道已经有"<<car<<"这个车辆\n";return ERROR;}if(isParkingFull(S)){//表示停车道此时车已经停满if(!L.front)initLinkQueue(L);//初始化便道队列cout<<"该停车场已经停满,需要借助临时便道!!!"<<endl;QueuePtr node=new QNode;node->data=car; node->next=NULL;//L.rear->next=node;//让车先暂时停放在便道 L.rear=node;}else{S.top->car=car;S.top->time_min=getTime();S.top++;S.length++;}return OK;
}
//便道上目前有几辆车
int side_len(LinkQueue L){int length=0;QueuePtr p=L.front;while(p!=L.rear){p=p->next;length++;}return length;
} 
//车辆离开停车场 
Status leaveParking(SqStack &S1,SqStack S2,LinkQueue &L,dataType &car){int flag=0,i=0;if(isParkingEmpty(S1)){cout<<"停车道为空,没有车辆\n";return ERROR;}initSqStack(S2);//初始化临时停放车道 parkingNode *temp=S1.top--;while(S1.top->car!=car&&S1.top!=S1.base){*S2.top++=*S1.top--;}if(S1.top==S1.base)if(S1.top->car!=car){cout<<"停车道没有这辆车"<<endl;S1.top=temp;return ERROR; }int t = getTime()-S1.top->time_min;cout<<S1.top->car<<"车"<<"已经停了"<<t<<"分钟"<<",需要收费:"<<100*t<<"元\t";while(S2.top!=S2.base)*S1.top++=*--S2.top;S1.length--;int len=MAXSIZE-S1.length;//停车道此时的空余位置 cout<<"此时停车道有"<<len<<"个空位\n";if(side_len(L)>0){//表示便道上目前有停放的车辆 QueuePtr p=L.front->next;QueuePtr q; while(p!=L.rear&&i<len){q=p;parking(S1,L,p->data);p=p->next;L.front->next=p;delete q;i++;}if(i<len){parking(S1,L,p->data);L.rear=L.front;delete p;}cout<<"便道上的车入库完成!!!\n";}return OK;
}
//遍历停车道车位信息
void print_Stack(SqStack S){parkingPmt p=S.base;cout<<"车辆信息(停车时间):";int t=getTime();if(p==S.top)return;while(p!=S.top){cout<<p->car<<"("<<t-p->time_min<<")\t";p++;}cout<<endl<<endl;
} 
//遍历便道车位信息
void print_Queue(LinkQueue L){QueuePtr p=L.front;cout<<"在便道等待的车辆信息:";if(p==L.rear)return;while(p!=L.rear){p=p->next;cout<<p->data<<"\t";}cout<<endl<<endl;
}int main(){int order,flag=1;dataType car;SqStack S1,S2;LinkQueue L;L.front=L.rear=NULL;initSqStack(S1);while(flag){cout<<"1.停车(还有"<<MAXSIZE-S1.length<<"个停车位)\n2.出库\n3.查询停车道车位信息\n4.查询便道停车位信息\n";cout<<"输入你要进行的操作(输入0退出):";cin>>order;switch(order){case 0:exit(OVERFLOW);case 1:cout<<"输入你要入库的车的编号(字符):";cin>>car;parking(S1,L,car);break;case 2:cout<<"输入你要出库的车的编号(字符):";cin>>car;leaveParking(S1,S2,L,car);break;case 3:print_Stack(S1);break;case 4:print_Queue(L);}cout<<endl;}
}

大家别光收藏呀,如果觉得代码写的还行顺手点个赞啊…

这篇关于停车场管理(C语言版)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/902910

相关文章

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

IDEA中的Kafka管理神器详解

《IDEA中的Kafka管理神器详解》这款基于IDEA插件实现的Kafka管理工具,能够在本地IDE环境中直接运行,简化了设置流程,为开发者提供了更加紧密集成、高效且直观的Kafka操作体验... 目录免安装:IDEA中的Kafka管理神器!简介安装必要的插件创建 Kafka 连接第一步:创建连接第二步:选

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应

NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64

转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=190176&id=4234854 一 前言 当管理大量连接时,特别是只有少量活跃连接,NGINX有比较好的CPU和RAM利用率,如今是多终端保持在线的时代,更能让NGINX发挥这个优点。本文做一个简单测试,NGINX在一个普通PC虚拟机上维护100k的HTTP

PMBOK® 第六版 规划进度管理

目录 读后感—PMBOK第六版 目录 规划进度管理主要关注为整个项目期间的进度管理提供指南和方向。以下是两个案例,展示了进度管理中的复杂性和潜在的冲突: 案例一:近期,一个长期合作的客户因政策要求,急需我们为多家医院升级一个小功能。在这个过程中出现了三个主要问题: 在双方确认接口协议后,客户私自修改接口并未通知我们,直到催进度时才发现这个问题关于UI设计的部分,后台开发人员未将其传递给