队列

来源:互联网 发布:rt809h编程器 编辑:程序博客网 时间:2024/06/04 23:36

队列的定义
队列是插入在一端,删除在其另一端的线性表。
队列示意图

对列的特性:①有序性。②先进先出。(与栈相反)

front 指向队首元素
rear 指向队尾元素的下一地址
指针的位置

队列的初始状态
这里写图片描述

进队三个元素
这里写图片描述
rear指针向后移动

第一个元素出队
这里写图片描述
front指针向后移动,永远指向队首

当front=rear时,判断队列为空。队列容易出现假溢出,于是出现了循环队列

循环队列
这里写图片描述
插入一个元素,形成循环队列算法
①rear++;
if(rear = Maxsize)rear= 0;//让走到队列最后一个位置时,使rear = 0
②rear = (rear + 1 )%MaxSize;

将元素item插入队尾
if(count == MaxSize)//判断是否队满
{ exit(1);}
count ++;
qlist[rear] = item;
rear = (rear + 1 )%MaxSize;

删除队首元素
if(count = 0)//判断是否队空
{exit(1);}
temp = qlist[front];//将队首元素赋值给temp
count –;
front = (front + 1)%MaxSize;//强制使front回到队首
return temp;

队空的条件:count = 0
队满的条件:count = MaxSize

链式队列结构
这里写图片描述

将item插入队列
if(front==null) //判断是否队空
front = rear = new Node(data,null);
else
rear = rear ->next = new Node(data,null);

应用–客户事件处理

// 程序中用到的主要变量EventList  ev;                // 事件表Event      en;                // 事件LinkQueue  q[5];              // 4个客户队列,q[0]未用QElemType  customer;          // 客户记录int TotalTime, CustomerNum;   // 累计客户逗留时间, 客户数int CloseTime;int cmp(Event a,  Event b) {  // 依事件a的发生时刻< 或= 或> 事件b的发生时刻分别返回-101  if (a.OccurTime < b.OccurTime) return -1;  if (a.OccurTime > b.OccurTime) return +1;  return 0;}void Random(int &durtime, int &intertime) { // 生成随机数   durtime = random(2, 10);   intertime = random(10);}int Minimum(LinkQueue q[]) {  // 求长度最短队列   int minlen = QueueLength(q[1]);   int i = 1;   for (int j=2; j<=4; j++)      if (QueueLength(q[j]) < minlen) {         minlen = QueueLength(q[j]);         i = j;      }   return i;}void OpenForDay() {   // 初始化操作   TotalTime = 0;  CustomerNum = 0;  // 初始化累计时间和客户数为0   InitList(ev);                     // 初始化事件链表为空表   en.OccurTime = 0;  en.NType = 0;  // 设定第一个客户到达事件   OrderInsert(ev, en, cmp);    // 按事件发生时刻的次序插入事件表   for (int i=1; i<=4; ++i) InitQueue(q[i]);   // 置空队列} // OpenForDayvoid CustomerArrived() {  // 处理客户到达事件,en.NType=0  int durtime, intertime, i, t;  ++CustomerNum;  printf("Customer %d arrived at %d and ", CustomerNum, en.OccurTime);  Random(durtime, intertime);            // 生成随机数  t = en.OccurTime + intertime;          // 下一客户到达时刻  if (t<CloseTime)                       // 尚未关门,插入事件表    OrderInsert(ev, MakeElem(t, 0), cmp);  i = Minimum(q);                        // 求长度最短队列  printf("enter the Queue %d\n", i);  EnQueue(q[i], MakeQElem(en.OccurTime, durtime));  if (QueueLength(q[i]) == 1) //设定第i队列的一个离开事件并插入事件表    OrderInsert(ev, MakeElem(en.OccurTime+durtime, i), cmp);} // CustomerArrivedvoid CustomerDeparture() {  // 处理客户离开事件,en.NType>0  printf("Customer departure at %d\n", en.OccurTime);  int i = en.NType;  DeQueue(q[i], customer); //删除第i队列的排头客户  TotalTime += en.OccurTime-customer.ArrivalTime; // 累计客户逗留时间  if (!QueueEmpty(q[i])) {   // 设定第i队列的一个离开事件并插入事件表    GetHead (q[i], customer);    OrderInsert(ev, MakeElem(en.OccurTime+customer.Duration, i), cmp);  }} // CustomerDeparturevoid Bank_Simulation(int closetime) {  int i = 0;  BLink p;  CloseTime = closetime;  printf("Bank_Simulation( %d ) ----- 银行业务模拟\n", closetime);  OpenForDay();                     // 初始化  while (!ListEmpty(ev)) {    printList(ev);    if (DelFirst(GetHead(ev), p)) {      en = GetCurElem(p);      if (en.NType == 0)        CustomerArrived();       // 处理客户到达事件      else CustomerDeparture();   // 处理客户离开事件    }    if (++i % 9 == 0) {      printf("\n----- 按任意键,继续 -----");      getch();      printf("\n\n");    }  }  // 计算并输出平均逗留时间  printf("\nThe Average Time is %f\n", (float)TotalTime/CustomerNum);} // Bank_Simulation
0 0