2023年6月22日发(作者:)
数据结构之队列—轮渡模拟⼀、简单介绍 这是在博客园潜⽔⼏个⽉第⼀次开始想要写点东西,⼀是记录⾃⼰的学习过程,⼆是和⼤家分享同时接受⼤家的指正,再者可以多交⼀些朋友,我微博地址在公告栏⾥。。。。这是最近上数据结构时的练习题,⾸先是队列的实现,再⽤队列去模拟解决⼀个实际问题——轮渡模拟。⼆、问题分析 2.1 问题描述:轮渡模拟:有⼀个渡⼝,每条渡船能⼀次性装载10辆汽车过河,车辆分为客车和货车两类。上渡轮有如下规定:同类汽车先到先上船,客车先于货车上船,轮渡每10分钟⼀班。模拟⼀⼩时内汽车上渡轮的过程。汽车:包含⼀个汽车类型属性,⼀个到达时间属性,到达时间随机产⽣。轮渡:包含⼀个装车情况的属性,⼀个出发时间的属性。输出:1⼩时内六班轮渡的装车情况。2.2 实现说明:轮渡不管是否装满10秒钟⼀班,⼀共进⾏6班共⼀分钟;期间的汽车到来时间及类型是随机的;初始当前已有⼀班渡轮停靠在渡⼝; 当拿到这个问题时,分析问题后觉得要⽐较好的使各个事件不相互影响地模拟轮渡情况,需要⽤到多线程,但因为以前都是在Linux环境下编程,没有在Windows上实现过多线程编程,所以也不知道在具体实现中是否会存在什么问题。实现时在主函数中创建了三个线程:其中两个线程分别是客车和货车随机产⽣(到达),并携带时间信息进⼊到相应的队列;还有⼀个是⽤于做计时器⽤。
三、实现代码3.1测试#include #include #include #include #include #include "sqQueue.h" //包含⾃定义队列类using namespace std;#define MAX_NUM 10 //渡轮最⼤装载数量typedef enum{PassengerCar, FreightCar}CarType; //汽车类型typedef struct
{ CarType type; //汽车类型 time_t arriveTime; //汽车到达时间}Car;typedef struct
{ int size; //渡轮当前装载汽车数量 time_t startTime; //渡轮出发时间}Ferry;SqQueue pCarQueue(61); //定义队列,⽤于存放客车的队列,模拟⼀分钟最多60辆汽车SqQueue fCarQueue(61); //定义队列,⽤于存放货车的队列int startTimeFlag = 0; //定义渡轮出发标志int countLength = 6; //计数长度unsigned _stdcall threadCountFun(void* pArguments){ while (countLength > 0) { Sleep(10000); //计数10秒 startTimeFlag = 1; countLength--; } return 0;}
bool ferryFun() //函数:处理渡轮到达,装载,出发等{ int count = 1; //渡轮计数 while (count<7) { Ferry ferry; = 0; //初始轮渡装载汽车数量 while(1) { if ( < 10 ) //轮渡未满 { if (!y_SqQueue() && !y_SqQueue() && _SqQueue().arriveTime == _SqQueue().arriveTime) { //当两队列对头汽车到达时间相同时,客车先上船 cout<<"⼀辆客车上船...其到达渡⼝时间:"; cout< } return true;}unsigned _stdcall threadPCarFun(void* pArguments) //客车处理函数{ srand(time(0));
while (!_SqQueue()) { Car car; if (1 == rand()%14) //1(客车) { = PassengerCar; time(&Time); //记录到达时间 _SqQueue(car); // cout<<"P: "<
评论列表(0条)