12.3队列模拟

#ifndef QUEUE_H_
#define QUEUE_H_
class Customer
{
public:
	Customer(){ m_arrive = m_processtime = 0; }
	void set(long when);
	long when()const{ return m_arrive; }
	int ptime()const { return m_processtime; }
protected:
private:
	long m_arrive;
	int m_processtime;
};

typedef Customer Item;

class Queue
{
public:
	Queue(int qs = Q_SIZE);
	~Queue();
	bool isempty() const;
	bool isfull() const;
	int  queuecount()const;
	bool enqueue(const Item &item);
	bool dequeue(Item &item);
protected:
private:
	struct Node {Item item; struct Node*next;};
	enum {Q_SIZE = 10};

	Node*m_front;
	Node*m_rear;
	int m_items;//队列坐标
	const int m_qsize;//队列容量

	Queue(const Queue&q) :m_qsize(0){}
	Queue&operator =(const Queue &q){ return *this; }

};
#endif

#include "queue.h"
#include <cstdlib>
Queue::Queue(int qs) : m_front(nullptr), m_rear(nullptr), m_items(0), m_qsize(qs)
{

}
Queue::~Queue()
{
	Node*temp;
	while (m_front!=nullptr)
	{
		temp = m_front;
		m_front = m_front->next;
		delete temp;
	}
}
bool Queue::isempty() const
{
	return m_items == 0;
}
bool Queue::isfull() const
{
	return m_items == m_qsize;
}
int  Queue::queuecount()const
{
	return m_items;
}
bool Queue::enqueue(const Item &item)
{
	if (isfull())
	{
		return false;
	}
	Node *add = new Node;
	add->item = item;
	add->next = nullptr;
	m_items++;
	if (m_front==nullptr)
	{
		m_front = add;
	}
	else
	{
		m_rear->next = add;
	}
	m_rear = add;
	return true;
}
bool Queue::dequeue(Item &item)
{
	if (m_front==nullptr)
	{
		return false;
	}
	item = m_front->item;//队列第一个项目给引用变量
	m_items--;
	Node*temp = m_front;//保存节点地址:4000
	m_front = m_front->next;
	delete temp;
	if (m_items==0)
	{
		m_rear = nullptr;
	}
	return true;
}

void Customer::set(long when)
{
	m_processtime = std::rand() % 3 + 1;
	m_arrive = when;
}
#include <iostream>
#include <cstdlib>
#include <ctime>
#include "queue.h"
const int MIN_PER_HR = 60;
using namespace std;

bool newcustomer(double x);
void main()
{
	srand(std::time(0));//每次不同
	cout << "Case Study :Bank of Heather Automatic Teller\n";
	cout << "Enter maximum size of queue: ";
	int qs;
	cin >> qs;
	Queue line(qs);

	cout << "Enter the number of simulation hours: ";
	int hours;
	cin >> hours;
	long cyclelimit = MIN_PER_HR * hours;

	cout << "Enter the average number of customers per hour: ";
	double perhour;
	cin >> perhour;
	double min_per_cust;
	min_per_cust = MIN_PER_HR;

	Item temp;
	long turnaways = 0;//等待
	long customers = 0;
	int  wait_time = 0;
	long line_wait = 0;
	long sum_line = 0;
	long served = 0;
	for (int cycle = 0; cycle < cyclelimit;cycle++)
	{
		if (newcustomer(min_per_cust))
		{
			if (line.isfull())
			{
				turnaways++;
			} 
			else
			{
				customers++;
				temp.set(cycle);
				line.enqueue(temp);
			}
		}
		if (wait_time<=0&&!line.isempty())
		{
			line.dequeue(temp);
			wait_time = temp.ptime();
			line_wait += cycle - temp.when();
			served++;
		}
		if (wait_time>0)
		{
			wait_time--;
		}
		sum_line += line.queuecount();
	}
	cout<<"hello.."<<endl;
	system("pause");
	return ;
}

bool newcustomer(double x)
{
	return (rand()*x / RAND_MAX < 1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值