您的位置:首页 > 理论基础 > 数据结构算法

数据结构之队列

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;满队列实际上仍有一个元素空间没被利用。

顺序表示的队列的描述:
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;
}
队列作为一种重要的数据结构,是必须要掌握的。我们在实际编程或者阅读开源项目时,会遇到很多关于队列的应用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: