标签:queue
Queue继承于List:
#include "../List/List.h" //以List为基类
template <typename T> class Queue: public List<T> { //队列模板类(继承List原有接口)
public: //size()、empty()以及其它开放接口均可直接沿用
void enqueue(T const& e) { insertAsLast(e); } //入队:尾部插入
T dequeue() { return remove(first()); } //出队:首部删除
T& front() { return first()->data; } //队首
};
模拟银行服务:
银行窗口Queue<Customer>* windows = new Queue<Customer>[nWin]; //为每一窗口创建一个队列
顾客struct Customer { int window; unsigned int time; }; //顾客类:所属窗口(队列)、服务时长
int bestWindow(Queue<Customer> windows[], int nWin) { //为新到顾客确定最佳队列
int minSize = windows[0].size(), optiWin = 0; //最优队列(窗口)
for (int i = 1; i < nWin; i++) //在所有窗口中
if (minSize > windows[i].size()) //挑选出
{ minSize = windows[i].size(); optiWin = i; } //队列最短者
return optiWin; //返回
}
void simulate(int nWin, int servTime) { //按指定窗口数、服务总时间模拟银行业务
Queue<Customer>* windows = new Queue<Customer>[nWin]; //为每一窗口创建一个队列
for (int now = 0; now < servTime; now++) { //在下班之前,每隔一个单位时间
if (rand() % (1 + nWin)) { //新顾客以nWin/(nWin + 1)的概率到达
Customer c ; c.time = 1 + rand() % 98; //新顾客到达,服务时长随机确定
c.window = bestWindow(windows, nWin); //找出最佳(最短)的服务窗口/*DSA*/ToDo: 更精细的策略
windows[c.window].enqueue(c); //新顾客加入对应的队列
}
for (int i = 0; i < nWin; i++) //分别检查
if (!windows[i].empty()) //各非空队列
if (-- windows[i].front().time <= 0) //队首顾客的服务时长减少一个单位
windows[i].dequeue(); //服务完毕的顾客出列,由后继顾客接替
/*DSA*/displayProgress(windows, nWin, now); //显示当前各(窗口)队列情况
/*DSA*/delay > 0 ? //若命令行指定的时间间隔为正数
/*DSA*/ _sleep(delay) : //则做相应的延迟
/*DSA*/ getchar(); //否则,以手动方式单步演示
} //while
delete [] windows; //释放所有队列(此前,~List()会自动清空队列)
}
标签:queue
原文地址:http://blog.csdn.net/ganxiang2011/article/details/46285499