数据结构之队列
2015-10-19 11:14
766 查看
队列(queue)是一种线性结构,定义如下:若给定队列Q=(a0,a1,…,an-1),则称a0是队头元素,an-1是队尾元素。元素a0,…,an-1依次入队,出队的顺序与入队相同,a0出队后,a1才能出队,因此又称队列为先进先出(FirstIn First Out——FIFO)的动态线性数据结构
出队列只能在队头,入队列只能在队尾
队列的表示方法有顺序表示、循环表示和链式表示。
顺序表示如图
头指针f指向队首元素的前一个位置,尾指针r指向最后一个元素。从图中可以看出,若再有元素入队,将发生溢出,而其实队列中还有3个空元素空间,我们称这种情况为假溢出。
为解决这种假溢出的情况,我们把数组逻辑上堪称呢个一个头尾相连的环。如下图
.下图为关于循环队列的操作
,由图可以总结出来一些规律:入队列时,(rear+1)%MaxSize;出队列时,(front+1)%MaxSize;空队列即front==rear;满队列即(rear+1)%MaxSize==front;满队列实际上仍有一个元素空间没被利用。
顺序表示的队列的描述:
链式表示的队列如图
.链式队列的入队和出队操作
出队列只能在队头,入队列只能在队尾
队列的表示方法有顺序表示、循环表示和链式表示。
顺序表示如图
头指针f指向队首元素的前一个位置,尾指针r指向最后一个元素。从图中可以看出,若再有元素入队,将发生溢出,而其实队列中还有3个空元素空间,我们称这种情况为假溢出。
为解决这种假溢出的情况,我们把数组逻辑上堪称呢个一个头尾相连的环。如下图
.下图为关于循环队列的操作
,由图可以总结出来一些规律:入队列时,(rear+1)%MaxSize;出队列时,(front+1)%MaxSize;空队列即front==rear;满队列即(rear+1)%MaxSize==front;满队列实际上仍有一个元素空间没被利用。
顺序表示的队列的描述:
template <class T> class SeqQueue:public Queue<T> { public: SeqQueue(int mSize); ~SeqQueue(){ delete []q;} bool IsEmpty() const; bool IsFull() const; bool Front(T& x)const; bool EnQueue(T x); bool DeQueue(); void Clear(){front=rear=0;} private: int front,rear; int maxSize; T *q; };
构造函数 template <class T> SeqQueue<T>::SeqQueue(int mSize) { //生成一个空队列 maxSize=mSize; q=new T[maxSize]; front=rear=0; } 析构函数 ~SeqQueue() { delete []q; }
判断是否为空队列 template <class T> bool SeqQueue<T>::IsEmpty() const { return front==rear; }
判断是否为满队列 template <class T> bool SeqQueue<T>::IsFull() const { return (rear+1) % maxSize==front; }
取队列元素 template <class T> bool SeqQueue<T>::Front(T& x) { if(IsEmpty()) { cout<<"empty"<<endl; return false; } x=q[(front+1) % maxSize]; return true; }
入队列 template <class T> bool SeqQueue<T>::EnQueue(T x) { if(IsFull()) { cout<<"Full"<<endl; return false; } q[(rear=(rear+1) % maxSize)]=x; return true; }
出队列 template <class T> bool SeqQueue<T>::DeQueue() { if(IsEmpty()) { cout<<"Underflow"<<endl; return false; } front=(front+1) % maxSize; return true; }
链式表示的队列如图
.链式队列的入队和出队操作
入队列 EnQueue(T x){ <span style="white-space:pre"> </span>Node<T> *q = new Node<T>; <span style="white-space:pre"> </span>q->element = x; <span style="white-space:pre"> </span>q->link = NULL; <span style="white-space:pre"> </span>rear->link = q; <span style="white-space:pre"> </span>rear=q; }
出队列 DeQueue(){ <span style="white-space:pre"> </span>Node<T> *q = front; <span style="white-space:pre"> </span>front=front->link; <span style="white-space:pre"> </span>del q; }队列作为一种重要的数据结构,是必须要掌握的。我们在实际编程或者阅读开源项目时,会遇到很多关于队列的应用。
相关文章推荐
- 数据结构(三)递归算法
- 数据结构(四)C++动态存储分配
- 数据结构——整数的四则运算
- 数据结构——查找之二叉排序树
- c++数据结构——模板类重写二叉树
- 优先级队列(PriprityQueue)是一种什么样的数据结构
- 各种数据结构的复杂度
- 数据结构 (五)c++函数和参数传递 按值传递 按引用传递
- 数据结构:字典树的基本使用
- 数据结构:字典树的基本使用
- Hadoop集群管理 Namenode的目录数据结构
- 数据结构之顺序表
- [题解+总结]20151017数据结构
- 数据结构与算法80道
- 第六周--数据结构之自建算法库之迷宫问题(用队列)
- 数据结构之图
- 第六周--数据结构之自建算法库之迷宫问题(用栈结构)
- 数据结构基本概念
- 中国大学MOOC-陈越、何钦铭-数据结构 列出连通集
- 第六周--数据结构之自建算法库之表达式求值(用栈结构)