数据结构作业2 ------ 用队列模拟银行排队的情况

时间:2022-09-06 21:54:44

================数据结构作业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 分钟

中国人民银行关门大吉!