队列模拟(C++)

Queue.h

#pragma once
class Customer 
{
private:
	long arrive;
	int processtime;
public:
	Customer() { arrive = processtime = 0; }
	void set(long when);
	long when() const { return arrive; }
	int ptime() const { return processtime; }
};

typedef Customer Item;

class Queue
{
private:
	struct Node
	{
		Item item;
		struct Node *next;
	};
	enum{Q_SIZE=10};
	Node *front;
	Node *rear;
	int items;
	const int qsize;
	Queue(const Queue &q) :qsize(0) { }
	Queue &operator=(const Queue &q) { return *this; }
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);
};

Queue.cpp

#include "Queue.h"
#include<cstdlib>


Queue::Queue(int qs) :qsize(qs)
{
	front = NULL;
	rear = NULL;
	items = 0;
}


Queue::~Queue()
{
	Node *temp;
	while (front != NULL) {
		temp = front;
		front = front->next;
		free(temp);
	}
}

bool Queue::isempty() const {
	return items == 0;
}

bool Queue::isfull() const {
	return items == qsize;
}

int Queue::queuecount() const {
	return items;
}

bool Queue::enqueue(const Item &item) {
	if (isfull())	return false;
	Node *add = new Node;
	add->item = item;
	add->next = NULL;
	items++;
	if (front == NULL)	front = add;
	else	rear->next = add;
	rear = add;
	return true;
}

bool Queue::dequeue(Item &item) {
	if (front==NULL)	return false;
	item = front->item;
	items--;
	Node *temp = front;
	front = front->next;
	delete(temp);
	if (items == 0)	rear = NULL;
	return true;
}

void Customer::set(long when) {
	processtime = std::rand() % 3 + 1;
	arrive = when;
}

ATM模拟

bank.cpp

#include<iostream>
#include<cstdlib>
#include<ctime>
#include"Queue.h"
const int MIN_PER_HR = 60;
bool newcustomer(double x);

int main() {
	using std::cin;
	using std::cout;
	using std::endl;
	using std::ios_base;

	std::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 hours: ";
	double perhour;
	cin >> perhour;
	double min_per_cust;
	min_per_cust = MIN_PER_HR / perhour;

	Item temp;
	long turnaways = 0;
	long customers = 0;
	long served = 0;
	long sum_line = 0;
	int wait_time = 0;
	long line_wait = 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();
	}

	if (customers > 0) {
		cout << "customers accepted: " << customers << endl;
		cout << "  customers served: " << served << endl;
		cout << "         turnaways: " << turnaways << endl;
		cout << "average queue size: ";
		cout.precision(2);
		cout.setf(ios_base::fixed, ios_base::floatfield);
		cout << (double)sum_line / cyclelimit << endl;
		cout << " average wait time: " << (double)line_wait / served << "minutes\n";
	}
	else cout << "No customers!\n";
	cout << "Done!\n";
	return 0;
}

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

声明:以上整理自个人理解和Stephen Prata 著的《C++ Primer Plus》

猜你喜欢

转载自blog.csdn.net/MoooLi/article/details/82841924
今日推荐