常见基本数据结构——队列

队列ADT数组

像栈同样,队列也是一种表。然而使用队列时插入在一端进行而删除在另外一端进行。数据结构

 队列模型测试

队列的基本操做是Enquene(入队),它在表的末端插入一个元素,还有Dequene(出队),它是删除在表的开头的元素。ui

队列的数组形式spa

如同栈的形式同样,对于队列而言任何表的实现都是合法的。就像栈同样,对于每一种操做,链表实现和数组实现都给出快速的O(1)运行时间。code

对于队列数据结构,咱们保留一个数组Quene[]以及位置Front和Rear,它们表明队列的两端。咱们还要记录实际存在于队列中的元素的个数size。全部这些信息是做为一个结构的一部分,除队列例程自己外一般不会有例程直接访问它们。blog

当一个元素X入队时,咱们让Size和Rear增长1,而后至Quene[Rear]=X。若使一个元素出队,咱们置返回值为Quene[Front],而后Size减1,而后使Front增长1。队列

一个存在的问题是,当入队了较多元素时,Rear会到达数组的末端,下一个位置多是不存在的,可是数组中的空间可能有较多剩余。ip

简单的解决办法是,只要Front和Rear到达数组的尾端,它就又绕回开头。这叫作循环数组实现。ci

实现回绕所须要附加的代码是极小的(虽然它可能使得运行时间加倍)。若是Front或者Rear增长1使得超越了数组,那么其值就要重置为数组的第一个位置。

关于队列的循环实现,有两件事情要警戒,第一:检测队列是否为空;第二,存在多种表示队头和队尾的操做。例:不使用单元来表示队列的大小,而是依靠基准状况,当队列为空时Rear=Front-1。队列的大小经过比较Rear和Front来实现的。若是数组的大小为ASize时,当有ASize-1个元素时就表示队列满了。

 

队列的声明

struct QueueRecord;
typedef struct QueueRecord *Queue;

struct QueueRecord{
  int Capacity;
  int Front;
  int Rear;
  int Size;
  ElementType *Array;
}

测试队列是否为空

void
IsEmpty(Queue Q){
  return Q->Size == 0;
}

构造空队列的例程

void
MakeEmpty(Queue Q){
  Q->Size = 0;
  Q->Front = 1;
  Q->Rear = 0;
}

入队的例程

static int
Succ(int Value, Queue Q){
  if(++Value == Q->Captity){
    Value = 0;
  }
  return Value;
}


void Enqueue(ElementType X, Queue Q){   if(IsFull(Q))     Error();   else{     Q->size++;     Q->Rear = Succ(Q->Rear, Q);     Q->Array[Q->Rear] = X;   } }
相关文章
相关标签/搜索