您的位置:首页 > 理论基础 > 数据结构算法

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

2013-04-02 00:14 429 查看
================数据结构作业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 分钟

中国人民银行关门大吉!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐