停车场管理模拟程序

2024-03-13 09:32

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

#include<iostream>
#include<fstream>
using namespace std;

#define MAX_SIZE  2//停车场能够容纳的车的数量
#define FARE     5//表示停车场的收费为每小时FARE元

int CountForStack=0;// 此全局变量用来计数堆栈现有的车数
int CountForQueue=0;// 此全局变量用来计数队列现有的车数

typedef struct//这个节点用来保存每辆车的信息
{
 char Condition ;//用来表示“到达”或者“离开”的状态," "表示还没有到达,也没有离开
 int  ArriveTime;//用来记录到达时间,默认为-1,说明还没有到达
 int  LeaveTime;// 用来记录离开时间,默认为-1,说明还没有离开
 int  License;// 记录车牌号
}CarNode;

typedef struct //栈的定义
{
 CarNode *base;//栈底指针,指向0
 CarNode *top;//栈顶指针,如果指向0,说明栈为空
 int stacksize;//栈的容量大小
}CarStack;

typedef struct QNode//队列节点的定义
{
 char Condition ;//用来表示“到达”或者“离开”的状态," "表示还没有到达,也没有离开
 int  ArriveTime;//用来记录到达时间,默认为-1,说明还没有到达
 int  LeaveTime;// 用来记录离开时间,默认为-1,说明还没有离开
 int  License;// 记录车牌号
 QNode *next;//指向下一个节点的指针

}QNode;

typedef struct// 队列的定义
{
 QNode *front;//队头指针
 QNode *rear;//队尾指针
}Queue;


bool InitStack(CarStack &S)//此函数用来初始化栈
{
 S.base =(CarNode *)malloc(MAX_SIZE*sizeof(CarNode));
 if(!S.base )
 {
  cout<<"内存分配失败!"<<endl;
  return false;//说明内存分配失败,返回false
 }

 S.top =S.base ;
 S.stacksize =MAX_SIZE;
 return true;
}

bool InitQueue(Queue &Q)//此函数用来初始化队列
{
 Q.front =(QNode *)malloc(sizeof(QNode));
 if(!Q.front )
 {
  cout<<"内存分配失败!"<<endl;
  return false;
 }
 Q.rear =Q.front ;
 Q.front ->next =0;//下一个节点指空
 return true;
}

bool EnQueue(Queue &Q,QNode &qnode)//此函数用来入队一个节点
{
 QNode *p=(QNode *)malloc(sizeof(QNode));
 if(!p)
 {
  cout<<"内存分配失败!"<<endl;
  return false;
 }

 p->ArriveTime =qnode.ArriveTime ;
 p->Condition =qnode.Condition ;
 p->LeaveTime =qnode.LeaveTime ;
 p->License =qnode.License ;
 p->next =0;

 Q.rear ->next =p;
 Q.rear =p;
 return true;
}

bool DeQueue(Queue &Q,QNode &t)//此函数用来出队
{
 if(Q.front ==Q.rear )
 {
  cout<<"队列为空!"<<endl;
  return false;
 }

 QNode *p=Q.front->next ;
    t.ArriveTime =p->ArriveTime ;
 t.Condition =p->Condition ;
 t.LeaveTime =p->LeaveTime ;
 t.License =p->License ;
 Q.front ->next =p->next ;
 if(Q.rear ==p)//如果P是指向最后一个出队的元素
  Q.rear =Q.front ;
 free(p);
 return true;
}

 

void InitCarNode(CarNode &C,char condition,int arrivetime,int leavetime,int license)//本函数用来初始化一个CarNode 节点
{
 C.ArriveTime =arrivetime;
 C.Condition =condition;
 C.LeaveTime =leavetime;
 C.License=license;
}
 


bool Push(CarStack &S,CarNode &car)//此函数用来入栈一个CarNode 节点
{
 if(S.top -S.base >=S.stacksize )
 {
  cout<<"此栈已满,不能压入新的信息"<<endl;
  return  false;
 }

 (*S.top ).ArriveTime =car.ArriveTime ;
 (*S.top ).Condition =car.Condition ;
 (*S.top ).LeaveTime =car.LeaveTime ;
 (*S.top ).License =car.License ;
 ++S.top ;//栈顶指针上移
 return true;
}

bool Pop(CarStack &S,CarNode &t)//此函数用来弹出栈内元素
{
 if(S.top ==S.base )
 {
  cout<<"栈空,不能执行出栈操作!"<<endl;
  return false;
 }

    --S.top ;//栈顶指针下移
 t.ArriveTime =(*S.top ).ArriveTime ;
 t.Condition =(*S.top ).Condition ;
 t.LeaveTime =(*S.top ).LeaveTime ;
 t.License =(*S.top ).License ;

 return  true;
}

bool IsStackFull(CarStack &S)//此函数用来判断堆栈是否已满
{
 if(S.top -S.base >=S.stacksize )
  return true;
 else 
  return false;
}

bool IsStackEmputy(CarStack &S)//此函数用来判断堆栈是否为空
{
 if(S.top ==S.base )
  return true;
 else 
  return false;
}

bool IsQueueEmputy(Queue &Q)//此函数用来判断队列是否为空
{
 if(Q.front ==Q.rear )
  return true;
 else
  return false;
}


bool SearchInStack(CarStack&S,int a)//a表示要查找的车牌号,如果在停车场里面,就返回true
{  
 bool tag=false;
 if(!IsStackEmputy(S))
 {
 CarNode *p=S.top-1 ;
 while(p!=S.base )
 {
  if((*p).License ==a)
   tag=true;
  --p;
 }
 if((*p).License ==a)
   tag=true;
 }
 return tag;
}

bool SearchInQueue(Queue &Q,int a)//a表示要查找的车牌号,如果在通道里面,就返回true
{
 bool tag=false;
 if(!IsQueueEmputy(Q))//如果队列非空
 {
  QNode *p=Q.front->next ;
  while(p!=Q.rear)
  {
   if((*p).License ==a)
    tag=true;
  }//退出此while循环时p指向最后一个元素
     if((*p).License ==a)
    tag=true;
 }
 return tag;
}


  


void InCar(CarStack &S,Queue &Q,int a1,int a2)//此函数用来表示进入车辆, 参数a1用来表示到达时间,参数a2表示车牌号码
{
    if(SearchInStack(S,a2))
 {
  cout<<"车号"<<a2<<"已经存在于停车场内,输入有误"<<endl;
  return ;
 }

 if(SearchInQueue(Q,a2))
 {
        cout<<"车号"<<a2<<"已经存在于通道内,输入有误"<<endl;
  return ;
 }


 if(IsStackFull(S))//如果堆栈已满,说明停车场已满,需要停车在通道
 {
  QNode  qnode;
  qnode.ArriveTime =-1;//在通道时间不收费,所以不计时
  qnode.Condition ='A';
  qnode.LeaveTime =-1;//定义为-1,说明还没有开始离开
  qnode.License =a2;
  EnQueue(Q,qnode);//停在通道上
  ++CountForQueue;
  cout<<"车号:"<<qnode.License <<"停在通道的第"<<CountForQueue<<"号位置"<<endl;
 }

 else
 {
  CarNode carnode;
  carnode.ArriveTime =a1;
  carnode.Condition ='A';
  carnode.LeaveTime =-1;
  carnode.License =a2;
  Push(S,carnode);
  ++CountForStack;
        cout<<"车号:"<<carnode.License <<"到达时间 "<<carnode.ArriveTime <<"停在停车场的第"<<CountForStack<<"号位置"<<endl;
 }
}

void OutCar(CarStack &S,Queue &Q,int a1,int a2)//此函数用来出车,参数a1用来表示离开时间,参数a2表示车牌号码
{    
 if(SearchInQueue(Q,a2))
 {
        cout<<"车号"<<a2<<"存在于通道内,还未进入停车场,不能离开"<<endl;
  return ;
 }
    if(!SearchInStack(S,a2))
 {
  cout<<"车号"<<a2<<"不在停车场内,输入有误"<<endl;
  return ;
 }

 CarStack tempstack;
 InitStack(tempstack);//建立并且初始化用于暂存出车时让车的堆栈

    bool  tag1=false;//标志这个停车场出车以前是否已满,默认为没有满
 tag1=IsStackFull(S);
 bool  tag2=true;//标志通道是否有汽车在等待, 默认为通道为空
 tag2=IsQueueEmputy(Q);

 CarNode temp;//用来保存暂时取出的汽车
 bool tag3=false;//用来标志是否是离开时间小于到达时间而导致离开失败,true表示离开失败
 while(1)//让车离开
 {
  Pop(S,temp);
  if(temp.License ==a2)
  {  
   if(a1<temp.ArriveTime )
   
   {
    cout<<"输入有误,离开时间不能小于到达时间,离开失败"<<endl;
    tag3=true;
    Push(tempstack,temp);
   }
   else
   cout<<"车号"<<a2<<"现在离开停车场,所用的时间为"<<a1-temp.ArriveTime <<"收费为"<<(a1-temp.ArriveTime )*FARE<<endl;
   break;
  }
  else
   Push(tempstack ,temp);//进入暂存栈
 }
    
 while(!IsStackEmputy(tempstack))//倒出的车再次进入停车场
 {
  Pop(tempstack,temp);
  Push(S,temp);
 }
   
 QNode tempqnode;//用来暂时保存从通道出来的汽车
 if(tag1==true&&tag2==false&&tag3==false)//如果出车前停车场已满,并且通道不为空,并且离开没有失败
 {
  DeQueue(Q,tempqnode);
  --CountForQueue;
  temp.ArriveTime =a1 ;
  temp.Condition =tempqnode.Condition ;
  temp.LeaveTime =tempqnode.LeaveTime ;
  temp.License =tempqnode.License ;
  Push(S,temp);
 }
 if(tag2==true&&tag3==false)// 如果停车场没有满,并且离开成功
  --CountForStack;

}

void showmenu(CarStack &S,Queue &Q)
{
 cout<<"******************************选择菜单*******************************"<<endl;
 cout<<"                     1: 停车"<<endl;
 cout<<"                     2: 离开"<<endl;
 cout<<"                     3: 退出"<<endl;
 cout<<"*****************************请按键选择******************************"<<endl;
 int tag;
 cin>>tag;
 while(tag!=1&&tag!=2&&tag!=3)
  cin>>tag;
 int a1;
 unsigned int a2;
 switch(tag)
 {
 case 1:

  cout<<"请输入到达的车号"<<endl;
  cin>>a1;
  cout<<"请输入到达时间"<<endl;
  cin>>a2;
  InCar(S,Q,a2,a1);
  break;
  
 case 2:
  cout<<"请输入离开的车号"<<endl;
  cin>>a1;
  cout<<"请输入离开的时间"<<endl;
  cin>>a2;
  OutCar(S,Q,a2,a1);
  break;

 case 3:
  return ;
  break;
 }
   
 char ch;
 cout<<"*******************按E/e退出,按任意键返回菜单**************************"<<endl;
 cin>>ch;
 if(ch!='E'&&ch!='e')
  showmenu(S,Q);
}

 

 

void main()
{
 CarStack carstack;
 InitStack(carstack);// 建立并且初始化用于停车场的堆栈

 Queue   carqueue;
 InitQueue(carqueue);//建立并且初始化用于通道的队列

 showmenu(carstack,carqueue);


}
 

这篇关于停车场管理模拟程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/804405

相关文章

Redis实现RBAC权限管理

《Redis实现RBAC权限管理》本文主要介绍了Redis实现RBAC权限管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1. 什么是 RBAC?2. 为什么使用 Redis 实现 RBAC?3. 设计 RBAC 数据结构

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

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%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提