【数据结构】(五)队列,链式队列(银行排队算法)
(一)队列:(如果用循环将使算法时间变得复杂,所以为了提高运算效率,引入队列)
(1)假溢出:(为了解决假溢出,引入循环队列)
(2)循环队列:(判断空满条件)
其中方法二:
(3)队列的创建:(所有的引用修改都是为了可以传出去而使用的)
C++:
C语言:
(4)操作:
入队:
出队:
在主函数中输出item:
改为C++中语句:
读取对头元素:
(二)链式队列:
C++:
(2)区别:
(三)银行排队(离散事件模拟)问题:
表示:
如16,19,23都表示客户所用时间;
例如:16 2 -->表示在第二个窗口花了16分钟,对应5 11(排队5分钟,业务11分钟)
算法:(先图解,最后会有对应代码块)
还需要一个链表来存储和处理事件:
操作:cpp
代码:
List.h文件
#pragma once
#include <iostream>
using namespace std;
#include <string>
//*************----《链表初始化定义》----***********//
typedef struct evNode
{
int occurtime; //事件发生时间
int nType; //事件类型:-1表示到达,0~3表示四个窗口
struct evNode* next;
}evNode;
class EventList
{
private:
evNode* head; //头指针
int length;
public:
EventList() //构造函数
{
head = new evNode;
head->next = NULL;
length = 0;
}
~EventList() //析构函数,删除节点,清空
{
//释放再堆区开辟的所有节点
//保存释放的下一个节点
while (head->next)
{
evNode* p = head->next->next;
delete(head->next);
head->next = p;
}
length = 0;
}
bool isEmpty() //判断是否为空
{
if (length == 0)
{
return true;
}
else
{
return false;
}
}
void addNode(EventList List, evNode* eventItem) //向链表插入数据
{
//插入是要按离开或者到达的时间顺序进行插入
evNode* p = new evNode;
p = eventItem;
//对链表进行遍历,找到新用户该插入的位置
evNode* qi, *