队列
2016-04-18 13:45
162 查看
队列的定义
队列是插入在一端,删除在其另一端的线性表。
对列的特性:①有序性。②先进先出。(与栈相反)
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);
应用–客户事件处理
队列是插入在一端,删除在其另一端的线性表。
对列的特性:①有序性。②先进先出。(与栈相反)
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的发生时刻分别返回-1或0或1 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]); // 置空队列 } // OpenForDay void 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); } // CustomerArrived void 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); } } // CustomerDeparture void 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
相关文章推荐
- Vim 使用教程
- C# Winform窗口之间传值的多种方法浅析(转)
- 【坑】log4j-over-slf4j.jar AND slf4j-log4j12.jar的冲突问题
- 详解https是如何确保安全的?
- 内存管理_清除缓存
- hdu1599+floyd最小环
- [置顶] 设计模式(一)工厂模式
- 将OpenStack私有云部署到Hadoop MapReduce环境中
- C语言函数指针
- 物聯網系統開發工具
- android 图片加载库 Glide 的使用介绍
- java中四种操作(dom、sax、jdom、dom4j)xml方式详解与比较
- uml交互图
- (整理)人脸数据库
- centos7yum安装mesos(0.28)+marathon+zookeeper
- 字符串的next特征函数,KMP算法,C++
- 在eclipse中使用javap
- 通过公开的API获取图片并且下载保存
- 强制下线通知-基于应用的系统级别对话框
- ubuntu 12.04下访问windows共享文件夹