C++队列模拟

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
C++代码运行效果:
在这里插入图片描述
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<vector>
#include<math.h>
#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <list>
#include <time.h>
#include <iterator>
using namespace std;

#define MAXCAR 60 //最大队列长度 
#define MIN_PER_HR 60.0 
typedef struct item { 
	long Arrive; 
	int BordingTime; 
}Item; 
typedef struct node{
	Item item;
	struct node* Next;
}Node;
typedef struct queue {
	Node* front;
	Node* rear;
	int items;
}Queue;
void InitializeQueue(Queue* pq);
int QueueIsFull(const Queue* pq);
int QueueIsEmpty(const Queue* pq);
int QueueItemCount(const Queue* pq);
int EnQueue(Item item, Queue* pq);
int DeQueue(Item* pitem, Queue* pq);
void EmptyTheQueue(Queue* pq);
static void CopyToNode(Item item, Node* pq);
static void CopyToItem(Node* pq, Item* pi);
int NewCar(double x);
Item Cartime(long when);
double Average(double Ave[], int n);

int main() {
	Queue Line;
	Item Temp;
	double Hours;// 模拟小时数
	int Perhour;//每小时平均来多少辆出租车 
	int Cycle;
	double CycleLimit;
	long TurnAway = 0;//因队列已满被拒绝的出租车数量
	long Cars = 0;//加入队列的顾客数量 
	long Served = 0;//在模拟时间段接到乘客地出租车数量 
	long SumLine = 0;//累积的队列总长
	int WaiTime = 0;//当前到第一辆车载客出发的时间 
	long SumLineWait = 0;//队列累积的等待时间 
	double MinPerCars;//出租车到来的平均时间
	int t, tt;
	double Ave[1000] = {};
	double SumAv[1000] = {};
	puts("请输入模拟次数(不要超过1000次):");
	scanf_s("%d", &t);
	tt = t;//tt为循环次数
	puts("请输入模拟时长:");
	scanf_s("%lf", &Hours);
	puts("请输入平均每小时到机场排队的出租车数量:");
	scanf_s("%d", &Perhour);
	srand((unsigned int)time(0));
	while (tt--) {//模拟开始 
		Cars = 0; Served = 0; SumLine = 0;
		TurnAway = 0; WaiTime = 0; SumLineWait = 0;
		InitializeQueue(&Line);
		CycleLimit = MIN_PER_HR * Hours * 60;
		MinPerCars = (MIN_PER_HR * 60) / Perhour;
		for (Cycle = 0.0; Cycle < CycleLimit; Cycle++) {
			if (NewCar(MinPerCars)) {
				if (QueueIsFull(&Line))
					TurnAway++;
				else {
					Cars++;
					Temp = Cartime(Cycle);
					EnQueue(Temp, &Line);
				}
			}
			if (WaiTime <= 0 && !QueueIsEmpty(&Line)) {
				DeQueue(&Temp, &Line);
				WaiTime = Temp.BordingTime;
				SumLineWait += Cycle - Temp.Arrive;
				Served++;
			}
			if (WaiTime > 0)
				WaiTime--;
			SumLine += QueueItemCount(&Line);
		}
		if (Cars > 0) {
			printf("--------------------------------\n");
			printf("%-40s%-15ld\n", "进行排队的出租车总数(辆):", Cars);
			printf("%-40s%-15ld\n", "接到乘客的出租车数量(辆):", Served);
			printf("%-40s%-15ld\n", "由于场地限制拒绝的出租车数量(辆):", TurnAway);
			printf("%-40s%.2f\n", "出租车平均等待时间(秒):", (double)SumLineWait / Served);
		}
		else
			printf("No Cars!");
		Ave[tt] = (double)SumLineWait / Served;
		SumAv[tt] = Cars;
		EmptyTheQueue(&Line);
		printf("\n");
	}
	printf("--------------------------------\n");
	printf("%d 次模拟出租车等待时间平均值为 %.2f 分钟,进行排队出租车的"
		"(%.2f个小时)平均数为 %.2f 辆", t, Average(Ave, t) / 60, Hours, Average(SumAv, t));
	getchar();
	getchar();
	return 0;
}

void InitializeQueue(Queue* pq)
{
	pq->front = pq->rear = NULL;
	pq->items = 0;
}

int QueueIsFull(const Queue* pq)
{
	return pq->items == MAXCAR;
}

int QueueIsEmpty(const Queue* pq)
{
	return pq->items == 0;

}

int QueueItemCount(const Queue* pq)
{
	return pq->items;
}

int EnQueue(Item item, Queue* pq)
{
	Node* pnew;
	if (QueueIsFull(pq))
		return false;
	pnew = (Node*)malloc(sizeof(Node));
	if (pnew == NULL) {
		fprintf(stderr, "Unble to allocate memory!\n");
		exit(1);
	}
	CopyToNode(item, pnew);
	pnew->Next = NULL;
	if (QueueIsEmpty(pq))
		pq->front = pnew;
	else
		pq->rear->Next = pnew;
	pq->rear = pnew;
	pq->items++;
	return true;
}

int DeQueue(Item* pitem, Queue* pq)
{
	Node* pt;
	if (QueueIsEmpty(pq))
		return false;
	CopyToItem(pq->front, pitem);
	pt = pq->front;
	pq->front = pq->front->Next;
	free(pt);
	pq->items--;
	if (pq->items == 0)
		pq->rear = NULL;
	return true;
}

void EmptyTheQueue(Queue* pq)
{
	Item dummy;
	while (!QueueIsEmpty(pq))
		DeQueue(&dummy, pq);
}

void CopyToNode(Item item, Node* pq)
{
	pq->item = item;
}

void CopyToItem(Node* pq, Item* pi)
{
	*pi = pq->item;
}

int NewCar(double x)
{
	if (rand() * x / RAND_MAX < 1)
		return true;
	else
		return false;
}

Item Cartime(long when)
{
	Item cust;
	cust.BordingTime = 90;
	cust.Arrive = when;
	return cust;
}

double Average(double Ave[], int n)
{
	int i;
	double Sum = 0.0;
	for (i = 0; i <= n - 1; i++) {
		Sum += Ave[i];
	}
	return Sum / n;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值