码迷,mamicode.com
首页 > 其他好文 > 详细

Queue::定义

时间:2015-05-31 10:59:22      阅读:142      评论:0      收藏:0      [点我收藏+]

标签: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::定义

标签:queue

原文地址:http://blog.csdn.net/ganxiang2011/article/details/46285499

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!