顺序表示的队列——顺序队列4——轮渡管理

版权声明:本文为博主原创文章,未经博主允许不得转载。 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");
}

结果:

猜你喜欢

转载自blog.csdn.net/baidu_36669549/article/details/84565791
今日推荐