版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_36669549/article/details/84565791
【问题】
某汽车轮渡口,过江渡船每次能载10辆车过江。过江车辆分为客车类和货车类,上船有以下规定:同类车先到先上船,客车先于货车上渡船,且每上4辆客车,才允许上一辆货车;若等待货车不足4辆,则以货车代替,如果无货车等待则允许客车都上船。设计一个算法模拟渡口管理。
【分析】
初始时,上渡船汽车数count、上渡船客车数countbus、上渡船货车数counttrunk均为0。若输入命令E或e表示有汽车来渡江,可以分别按客车汽车分别进入相应的队列排队。
若输入命令O或o表示渡船到渡口,可按排队顺序将客车或货车上渡船:
(1)若车辆总数count<4,且客车队列非空,将客车队列的队头汽车出队上渡船。并进行计数,即count和countbus增1;
(2)若客车数countbus≥4,或客车队列为空队,且货车队列非空,将货车队列的队头汽车出队上渡轮。将countbus置为0,并进行计数即count和counttrunk增1;
(3)若货车队列为空且客车队列非空,将客车队队列的队头汽车出队上渡轮。count和countbus增1,将counttrunk置为0。
输入命令Q或q表示退出程序。
SeqQueue.h
#pragma once
#define QueueSize 100
//typedef int DataType;
typedef struct Squeue
{
DataType queue[QueueSize];
int front, rear;
}SeqQueue;
void InitQueue(SeqQueue *SCQ)
{
SCQ->front = SCQ->rear = 0;
}
int QueueEmpty(SeqQueue SCQ)
{
if (SCQ.front==SCQ.rear)
{
return 1;
}
else
{
return 0;
}
}
int EnQueue(SeqQueue *SCQ, DataType e)
{
if (SCQ->front==(SCQ->rear+1)%QueueSize)
{
return 0;
}
SCQ->queue[SCQ->rear] = e;
SCQ->rear = (SCQ->rear + 1) % QueueSize;
return 1;
}
int DeQueue(SeqQueue *SCQ, DataType *e)
{
if (SCQ->front==SCQ->rear)
{
return 0;
}
else
{
*e = SCQ->queue[SCQ->front];
SCQ->front = (SCQ->front + 1) % QueueSize;
return 1;
}
}
int GetHead(SeqQueue SCQ, DataType *e)
{
if (SCQ.front==SCQ.rear)
{
return 0;
}
else
{
*e = SCQ.queue[SCQ.front];
return 1;
}
}
void ClearQueue(SeqQueue *SCQ)
{
SCQ->front = SCQ->rear = 0;
}
main.cpp
#include <iostream>
using namespace std;
typedef int DataType;
#include "SeqQueue.h"
void FerryManage()
{
SeqQueue bus, trunk;
char ch;
DataType n;
int tag;
int count=0, countbus=0, counttrunk=0;
InitQueue(&bus);
InitQueue(&trunk);
while (1)
{
fflush(stdin);
cout << "输入命令(e或E表示入队,o或O表示出队,q或Q表示退出):" << endl;
//printf("输入命令(e或E表示入队,o或O表示出队,q或Q表示退出):\n");
scanf("%c", &ch);
switch (ch)
{
case 'e':
case 'E':
cout << "请输入车号(整数):";
scanf("%d", &n);
getchar();
cout << "是客车(1)还是货车(2):";
scanf("%d", &tag);
getchar();
if (tag==1)
{
EnQueue(&bus, n);
}
else
{
EnQueue(&trunk, n);
}
break;
case 'o':
case 'O':
while (count<10)
{
if (count<4&&!QueueEmpty(bus))
{
DeQueue(&bus, &n);
cout << "上船的车号:" << n << endl;
count++;
countbus++;
}
else if(!QueueEmpty(trunk))
{
countbus = 0;
DeQueue(&trunk, &n);
cout << "上船的车号:" << n << endl;
count++;
counttrunk++;
}
else if (!QueueEmpty(bus))
{
counttrunk = 0;
DeQueue(&bus, &n);
cout << "上船的车号:" << n << endl;
count++;
countbus++;
}
else
{
cout << "排队轮渡的车辆少于10辆。"<<endl;
return;
}
}
break;
case 'q':
case 'Q':
break;
}
if (ch=='q'||ch=='Q')
{
break;
}
}
}
void main()
{
FerryManage();
system("pause");
}
结果: