问题描述:

停车场管理员的任务就是帮助车主把车停放在停车场中,或者是帮助车主将 车开出乘车场。然后停车场中能够停放的车辆数目很多,这就使得让莫辆车开出停车场变得复杂。比如:要开走一辆车,则管理员需要把他前面的车全部暂时清除,然后等这辆车开出后再将这些车重新放入停车场。当然了,这个时候腾出了一个空位置,此位置由后面的车占据。
任务:编程模拟这样的情况,这里假设停车场最多可停放5辆车。data.txt记录了某一时间段内,该停车场车辆的到来与离开记录,刚开始,停车场是空的。其中大写字母A--P是车辆的代号,arrives--到来,departs---离开。
程序需要从data.txt中读取这些信息,并且用这些数据来模拟停车场的车辆调度情况。

data.txt内容如下:

A arrives
A departs
B arrives
C arrives
D arrives
C departs
E arrives
F arrives
G arrives
B departs
H arrives
D departs
E departs
I arrives
I departs
J arrives
F departs
K arrives
L arrives
M arrives
H departs
N arrives
J departs
K departs
O arrives
P arrives
P departs
O departs
L departs

实现代码如下:

模拟停车场问题.cpp(没有再继续分.h文件,混为一体了,主要.h文件过于简单)

#ifndef CAR_H #define CAR_H #include<iostream> #include<string> using namespace std; class car { public: car(string,int); string getlicense(); int getmovedtimes(); ~car(); void move(); private: string license;//车的通行证 int movedtimes;//被移动的次数 }; #endif car::car(string license,int movedtimes):license(license),movedtimes(0) { } string car::getlicense() { return license; } int car::getmovedtimes() { return movedtimes; } void car::move() { movedtimes++; } car::~car() {} #include<fstream> #include<stack> int main() { string in_filename="data.txt";//数据文件了,包含了停车场内的车辆进出记录 ifstream inf(in_filename.c_str());//void open(const char* filename,int mode,int access);另外,fstream还有和open()一样的构造函数,对于上例,在定义的时侯就可以打开文件了: //fstream file1("c://config.sys"); if(!inf) { cerr<<"文件打开失败!"<<in_filename<<endl; return EXIT_FAILURE; } stack<car*> parking_lot,tempstack;//定义两个栈,一个模拟停车场,另外一个用来暂时存放从停车场哪里暂时清除的车,当然最后还是得返回给停车场 car* pcar; string license_plate,action;//分别记录从数据文件中读取的通行证跟行为(到达?离开?) //按行读取数据文件 while(!inf.eof()) { inf>>license_plate>>action; if(action=="arrives")//到达 { if(parking_lot.size()<5)//栈不满的话,继续入栈 { pcar=new car(license_plate,0);//这个就不用多罗嗦 parking_lot.push(pcar); } else cout<<"抱歉"<<license_plate<<",停车场已满!"<<endl; } else if(action=="departs")//如果是出发 { //首先得给出判断,此时栈是否为空?而且出发的这辆车的license_plate是否位于栈顶 while( (!parking_lot.empty()) && (parking_lot.top()->getlicense()!=license_plate))//while循环 { tempstack.push(parking_lot.top()); parking_lot.top()->move();//增加移动次数 parking_lot.pop(); //delete parking_lot.top();此处还不能销毁结点,只是一个短暂的转移罢了 } if(parking_lot.top()->getlicense()==license_plate)//如果要出发的这辆车的license_plate刚好就处在栈顶位置,则直接销毁相关结点,不需要增加移动次数 { cout<<parking_lot.top()->getlicense()<<"被移动了"<<parking_lot.top()->getmovedtimes()<<" 次在这里!"<<endl;//输出被移动的次数 delete parking_lot.top(); parking_lot.pop(); } else cout<<"神马情况(异常)!"<<endl; //接下来还得进行还原,既然有移动那就得还原 while(!tempstack.empty()) { parking_lot.push(tempstack.top()); tempstack.pop(); } } } cout<<"还在车库里面的!"<<endl;//最后把还在车库里面的车的license输出,同时关注移动次数 while(!parking_lot.empty())//用循环依次遍历栈中的元素,也就是对应的车辆了 { cout<<parking_lot.top()->getlicense()<<" 被移动了"<<parking_lot.top()->getmovedtimes()<<"次在这里"<<endl; delete parking_lot.top();//销毁栈顶 parking_lot.pop();//出栈 } inf.close(); return 0; }

停车场模拟问题的分析思路,解决细节。加了关键注释。相关推荐

  1. LeetCode JAVA语言全部解题思路+答案代码+多种解法+关键注释(持续更新...)

    第一题: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组 ...

  2. Oracle 创建磁盘组报错ORA-15137的问题分析与解决思路

    点击上方"蓝字" 关注我们,享更多干货! ASM扩容本来是件很简单的事,当ASM磁盘准备好之后,直接一条命令就会添加上.但是也会有异常情况,最近就碰到Oracle 19c在扩容时报 ...

  3. Connection reset原因分析及解决思路

    Connection reset原因分析及解决思路 - lwli - 博客园 我们在开发过程中经常会出现Connection reset问题,包括http调用,数据库连接等场景.出现Connectio ...

  4. chatGPT Access denied问题分析和解决思路

    chatGPT Access denied问题分析和解决思路 先说结论: Access denied于你所使用的网络环境有关,是你的代理服务器的ip被ban了 不是封号!! 首先要考虑VPS封禁问题, ...

  5. mysql authentication_MySQL连接抛出Authentication Failed错误的分析与解决思路

    [问题描述] 在应用端,偶尔看到有如下报错: Authentication to host 'xxxx' for user 'yyyy' using method 'mysql_native_pass ...

  6. Melis系统崩溃问题分析以及解决思路

    Melis系统崩溃问题分析以及解决思路 在使用Melis 系统开发时,会经常遇到系统崩溃死机的问题,对于此类问题大家总是避之不及, 分析原因, 一方面是此类问题涉及到CPU异常模式架构,需要用户对ar ...

  7. 解决Feign接口调用有时候不好用的分析思路

    很多架构师为了鉴权,会把controller带过来的header信息一股脑的利用feign的拦截器带入RequestTemplate,然后方便feign接口鉴权.这时候可能会带入其他的header信息 ...

  8. Java中 9 种常见的 CMS GC 问题分析与解决

    目录 Java中 9 种常见的 CMS GC 问题分析与解决 1. GC 1.1 引言 1.2 概览 2. GC 基础 2.1 基础概念 2.2 JVM 内存划分 2.3 分配对象 2.4 收集对象 ...

  9. 美团技术总结:Java中9种常见的CMS GC问题分析与解决

    1. 写在前面 | 本文主要针对 Hotspot VM 中"CMS + ParNew"组合的一些使用场景进行总结.重点通过部分源码对根因进行分析以及对排查方法进行总结,排查过程会省 ...

最新文章

  1. 007.androidUI开发进阶(基础--案例) .
  2. 计算机技能鉴定几月考,计算机等级考试和职业技能鉴定考核大纲(二级Office).docx...
  3. html5 筛子,html5摇骰子游戏
  4. DoTween NGUI bug
  5. 【转载】Mysql注入点在limit关键字后面的利用方法
  6. hive拉链表实现方案一
  7. Android接口测试工具Apizza,自定义API请求返回值,自定义请求相对路径
  8. 软件测试工程师面试自我介绍部分模板
  9. Navicat导入连接
  10. 程序员,被代码耽误的段子手!
  11. 微信小程序(一)认识微信小程序
  12. 诙谐术语讲解:热备,冷备,云备,以及IT行业各种备份术语
  13. 向量空间模型原理(VSM)
  14. Oracle性能优化专题
  15. “蓝桥杯”练习系统(基础篇)
  16. ext2 grid 封装 (包含增删改查 导入导出等操作)
  17. 数据看板/商业智能分析仪表盘
  18. HJ88 扑克牌大小
  19. windows和Linux未来,一家之言:Windows系统的未来就是变成Linux的一部分
  20. 地震烈度速报崇州设7个播报台

热门文章

  1. Linux中学教程(一)
  2. 某次ctf 中crypto的基础题
  3. 前端使用CryptoJS加密解密
  4. HTML5期末大作业:化妆品商城网站设计——化妆品商城-功能齐全(43页) HTML+CSS+JavaScript web大作业 静态网页
  5. 在OpenCV里车牌识别的方法2
  6. FHE学习笔记 #2 多项式环
  7. Excel 随机生成数据
  8. D:\ANdriod\emulator\qemu\windows-x86_64\qemu-system-i386.exe: Could not open 'C:\Users\榛刓.android\a
  9. pytorch 定义torch类型数据_PyTorch官方中文文档:torch.Tensor
  10. 【陈工笔记】# 期刊 # Elsevier 期刊的投稿模板