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》