资源预览内容
第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
第9页 / 共9页
亲,该文档总共9页全部预览完了,如果喜欢就下载吧!
资源描述
数据结构之队列1、定义队列也是一种线性表,但就像堆栈一样,它的操作也受到限制。队列的所有插入操作都在表的一端进行,所有的删除操作都在表的另一端进行。它的所有操作都遵循“先进先出”原则,即先进入队列的元素一定是先离开队列。进行删除的一端叫做“队头”(Front),进行插入的一端叫做“队尾”(Rear)。2、队列的基本操作向队尾插入元素:QInsert()/入队一个元素删除队首元素:QDelete()/出队一个元素获取队首元素:QRead()/读取队首元素判断队列是否空:IsEmpty()判断队列是否满:IsFull()清空队列:QClear()3、队列的实现方法按照存储方式的不同队列分为两种,一种采用顺序存储方式存储称为顺序队列,另一种采用链式存储方式存储称为链式队列。3.1、顺序队列1顺序队列删除队头元素有以下两种方式。(1)不要求队头元素必须存放在下标为零的数组元素中每次删除队头元素,只需修改队头指针的位置,令front=front+1。该方式的优点是无须改变其它队列元素的地址,缺点是front值随着队头元素的删除而不断增加,整个队列向数组的后端移动。随着队尾元素的不断加入,必须出现数组后端没有可用空间的情况,而数组前端的大量空间却被闲置。(2)要求队头元素必须存放在下标为零的数组元素中每次删除队头元素,令所有元素都向前移动一个位置。该方式的优点是不浪费空间,缺点是所有元素的地址都必须改变,效率低下。为了克服上述缺点,可以假定数组是循环的,即采用环状模型来实现顺序队列。之和模型将队列在逻辑上置于一个圆环上,如下图所示,用整形变量front存放队头位置,每删除一个队头元素,就将front顺时针移动一个位置。整形变量rear存放新元素要插入的位置,每插入一个元素,rear将顺时针移动一个位置。整形变量count存放队列中元素的个数。当count等于数组规模size时,说明队列已满;当count等于0时,说明队列为空。环状队列的实现要用到求余运算:Front顺时针移动1位:front=(front+1)MOD sizerear顺时针移动1位:rear=(rear+1)MOD size以下是顺序队列的C+代码:/实现顺序队列#ifndef mod#define mod(x, y) (x%y)#endif#include using namespace std;/类声明template class AQueuepublic:AQueue(int MaxQueueSize);/构造函数AQueue();/析构函数bool QInsert(const T &item);/向队尾插入元素itembool QDelete(T &item);/删除队首元素并将该元素值保存到itembool QRead(T &item)const;/读取队首元素值bool IsEmpty()const;/判断队列是否空bool IsFull()const;/判断队列是否满void QClear();/清空队列private:int front;/队首元素在数组中的位置int rear;/新元素要插入的位置int count;/队列中元素的个数int size;/队列的规模T *QArray;/存放元素的数组;/类实现template AQueue:AQueue(int MaxQueueSize)front = 0;rear = 0;count = 0;size = MaxQueueSize;QArray = new TMaxQueueSize;template AQueue:AQueue()delete QArray;template bool AQueue:QInsert(const T &item)if (IsFull()/* code */coutQueue is full, cant insert data.endl;return false;QArrayrear = item;rear = mod(rear + 1, size);count+;return true;template bool AQueue:QDelete(T &item)if (IsEmpty()/* code */coutQueue is empty, cant delete.endl;return false;item = QArrayfront;front = mod(front + 1, size);count-;return true;template bool AQueue:QRead(T &item)constif (IsEmpty()/* code */coutQueue is empty, cant read.endl;return false;item = QArrayfront;return true;template bool AQueue:IsEmpty()constreturn (count = 0);template bool AQueue:IsFull()constreturn (count = size);template void AQueue:QClear()front = 0;rear = 0;count = 0;3.2、链式队列采用链式存储方式实现的队列称为链式队列。链式队列也用单链表结构,限定在表头(队列头)进行出队操作,在表尾(队列尾)进行入队操作。在实现过程中需要建立结点结构,定义分别指向队头和队尾的指针front和rear。首先建立结点结构LQueueNode,如下:template struct LStackNodeT data;/存储数据LStackNode *next; /指向下一个结点LStackNode(LStackNode* nextNode = NULL)next = nextNode;LStackNode(const T &item, LStackNode* nextNode =NULL)data = item;next = nextNode;以下是链式队列LQueue类的C+代码:/实现链式队列#include stdafx.h#include using namespace std;/建立结点结构template struct LQueueNode_InputIter data;LQueueNode *next;LQueueNode(LQueueNode *nextNode = NULL)next = nextNode;LQueueNode(const _InputIter &item, LQueueNode *nextNode = NULL)data = item;next = nextNode;/类声明template class LQueuepublic:LQueue();LQueue();bool QInsert(const _InputIter &item);bool QDelete(_InputIter &item);bool QRead(_InputIter &item)const;bool IsEmpty()const;void QClear();void QShow()const;private:LQueueNode *front;LQueueNode *rear;/类实现template LQueue:LQueue()front = NULL;rear = NULL;template LQueue:LQueue()QClear();template bool LQueue:QInsert(const _InputIter &item)if (IsEmpty()/* code */front = new LQueueNode(item);rear = front;return true;rear-next = new LQueueNode(item);rear = rear-next;return true;template bool LQueue:QDelete(_InputIter &item)/注意此处容易忽略释放内存if (IsEmpty()/* code */cout LQueue is empty, cant delete. endl;return false;LQueueNode *q = front;item = q-data;front = front-next;delete q;/此处较容易忽略,当front=null时,rear=nullif (IsEmpty()/* code */rear = NULL;return true;template bool LQueue:QRead(_InputIter &item)constif (IsEmpty()/* code */cout LQueue is empty, cant read. endl;return f
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号