数据结构作业2 ------ 用队列模拟银行排队的情况
================数据结构作业2 ------ 用队列模拟银行排队的情况============
直接上代码
----------------------queue.h----------------------------------------
//队列的接口 #ifndef QUEUE_H_ #define QUEUE_H_ class Customer { private: long arrive;//到达的时间 long processTime;//办理业务的时间 public: Customer():arrive(0),processTime(0){} void set(long when);//设置时间 long when() const//返回到达的时间 { return arrive; } int proTime() 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);//出队 }; #endif
----------------------queue.cpp----------------------------------------
#include "queue.h" #include <cstdlib> //使用成员初始化列表初始化成员变量 // 这种格式只能用于构造函数 // 必须使用这种格式来初始化非静态const数据成员 // 必须使用这种格式来初始化引用数据成员 Queue::Queue(int qs):qsize(qs) { front = rear = NULL; items = 0; } Queue::~Queue() { Node *temp; while(front != NULL) { temp = front; front = front->next; delete 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(); if(add == NULL) { return false; } 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)//这个item用于返回被删除的值 { if(front == NULL) { return false; } item = front->item;//让item指向队列的第一个元素 items--; Node* temp = front; front = front->next; delete temp; //如果出队后成空队列了就把real置空 if(items == 0) { rear = NULL; } return true; } void Customer::set(long when) { processTime = std::rand()%3 +1;//产生一个1~3之间的随机数 arrive = when; }
---------------------------TestQueue.cpp----------------------------------------
#include <iostream> #include <ctime> #include "queue.cpp" 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 <<"中国人民银行考试办理业务了\n"; cout << "输入队列能容纳的最大人数:"; int qs; cin >> qs; Queue line(qs);//创建一个容量为qs的队列line cout << "输入你需要模拟的小时数:"; int hours; cin >> hours; long cyclelimit = MIN_PER_HR*hours;//办理模拟业务的总分钟数 cout << "输入平均每小时的客户数量:"; 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;//已经办理过的客户数量 int sum_line = 0;//队列累计长度 int wait_time = 0;//用户在队列中的等待时间 long line_wait = 0;//队列的累计等待时间 //开始模拟 for(int cycle = 1; cycle <= cyclelimit; ++cycle) { if(newCustomer(min_per_cust))//如果有新客户 { cout << "第" << cycle << " 分钟来了一个客户, "; if(line.isFull()) { cout << "但是没地方排队了,所以离开了......\n"; turnaways++;//如果当前队列是满的客户会离开 } else { customers++; temp.set(cycle);//给该顾客设置办理业务的时间是1~3之间的随机数 //设置到达的时间是cycle line.enqueue(temp);//入队 wait_time = temp.proTime(); cout << "加入了队列, 他办理业务所需的时间是:" << temp.proTime() << endl; } } //完成业务办理 if(wait_time <= 0 && !line.isEmpty()) { cout << "第" << cycle << " 分钟 **>> 一个用户办理业务完毕**********************\n"; line.dequeue(temp); wait_time = temp.proTime(); line_wait += cycle-temp.when(); served++; //cout << "办理好一个业务\n"; } if(wait_time > 0) { wait_time--; } sum_line += line.queueCount(); } /////////////////////////////////////////////////////////////// //报告结果 if(customers > 0) { cout << "客户总量:" << customers << endl; cout << "已处理的客户数量:" << served << endl; cout << "没能办理的客户数量:" << turnaways << endl; cout << "平均队列长度:"; cout.precision(2);//保留两位小数 cout.setf(ios_base::fixed, ios_base::floatfield); cout.setf(ios_base::showpoint);//显示小数点 cout << double(sum_line)/double(cyclelimit) << endl; cout << "客户平均等待时间:" << double(line_wait)/served << " 分钟\n"; } else { cout << "没有用户!\n"; } cout << "\n中国人民银行关门大吉!\n"; return 0; } //判断是否会有新的客户加入 bool newCustomer(double x) { return (std::rand()*x/RAND_MAX < 1); }
///////////////////////////////////////////////////////////////////////////////////////////////////
测试结果:
中国人民银行考试办理业务了 输入队列能容纳的最大人数:3 输入你需要模拟的小时数:2 输入平均每小时的客户数量:20 第4 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:2 第5 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:1 第6 分钟 **>> 一个用户办理业务完毕********************** 第7 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:1 第8 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:2 第10 分钟 **>> 一个用户办理业务完毕********************** 第11 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:1 第12 分钟 **>> 一个用户办理业务完毕********************** 第13 分钟 **>> 一个用户办理业务完毕********************** 第15 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:1 第16 分钟 **>> 一个用户办理业务完毕********************** 第17 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:1 第18 分钟 **>> 一个用户办理业务完毕********************** 第19 分钟 **>> 一个用户办理业务完毕********************** 第26 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:1 第27 分钟 **>> 一个用户办理业务完毕********************** 第33 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:2 第35 分钟 **>> 一个用户办理业务完毕********************** 第38 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:2 第40 分钟 **>> 一个用户办理业务完毕********************** 第52 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:3 第55 分钟 **>> 一个用户办理业务完毕********************** 第56 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:2 第58 分钟 **>> 一个用户办理业务完毕********************** 第61 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:3 第62 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:1 第63 分钟 **>> 一个用户办理业务完毕********************** 第66 分钟 **>> 一个用户办理业务完毕********************** 第69 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:2 第71 分钟 **>> 一个用户办理业务完毕********************** 第73 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:1 第74 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:1 第75 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:1 第76 分钟来了一个客户, 但是没地方排队了,所以离开了...... 第76 分钟 **>> 一个用户办理业务完毕********************** 第77 分钟 **>> 一个用户办理业务完毕********************** 第78 分钟 **>> 一个用户办理业务完毕********************** 第83 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:3 第84 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:1 第85 分钟 **>> 一个用户办理业务完毕********************** 第86 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:2 第87 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:2 第89 分钟 **>> 一个用户办理业务完毕********************** 第90 分钟 **>> 一个用户办理业务完毕********************** 第92 分钟 **>> 一个用户办理业务完毕********************** 第93 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:2 第94 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:2 第96 分钟 **>> 一个用户办理业务完毕********************** 第98 分钟 **>> 一个用户办理业务完毕********************** 第100 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:2 第102 分钟 **>> 一个用户办理业务完毕********************** 第103 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:3 第106 分钟 **>> 一个用户办理业务完毕********************** 第111 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:3 第114 分钟 **>> 一个用户办理业务完毕********************** 第119 分钟来了一个客户, 加入了队列, 他办理业务所需的时间是:3 客户总量:28 已处理的客户数量:27 没能办理的客户数量:1 平均队列长度:0.72 客户平均等待时间:3.15 分钟 中国人民银行关门大吉!