正文

我所理解的队列012005-12-18 15:43:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/goal00001111/8486.html

分享到:

我所理解的队列     象栈一样,队列也是表。然而,使用队列时插入在一端进行而删除在另一端进行。 同样的,也有两种方法来实现队列,一种是用链表,一种是用数组。        先来看看用链表实现的队列。        我们把进行删除操作的一端叫队头(通常用链表的头结点表示),而进行插入操作的一端叫队尾, 通常用尾结点表示)。每当删除一个结点,头指针后移一位;反之,尾指针后移一位。所以用链表实现 队列的操作是很简单的,它的基本操作和链表的基本操作几乎完全相同。        实际上人们更喜欢用数组来实现队列。对于每一个队列数据结构,我们保留一个数组Queue[]以及 位置Front和Rear,他们位于表队列的两端。我们还要记录实际存在于队列中的元素的个数Size和 数组的最大容量Capacity,所有这些信息是作为一个结构的一部分。        数组实现的队列的一个特性就是可以循环使用数组的空间,只要Size小于Capacity(Front独占一个空间, 不放数据),就不会出现溢出。 //-----------用数组实现队列的存储结构------------- #define MinQueueSize 5 typedef struct QueueRecord{        ElemType *Array;        int Capacity;        int Front;        int Rear;        int Size; } *Queue; //-------------------用数组实现队列的基本操作------------------------ Queue InitQueue(void); //构造一个空队列  Queue MakeEmpty(Queue Q);//初始条件:队列Q非空。 操作结果:将队列Q重置为空队列。 int IsEmpty(Queue Q);//初始条件:队列Q已存在。 操作结果:判断队列Q是否为空队列。 int IsFull(Queue Q);//初始条件:队列Q已存在。 操作结果:判断队列Q是否为满队列。 int QueueLength(Queue Q);//初始条件:队列Q已存在。 操作结果:返回队列Q结点的个数。 ElemType GetFront(Queue Q);//初始条件:队列Q非空。 操作结果:返回队头元素的值 //初始条件:队列Q已存在。 操作结果:插入元素X为新的队尾元素 void EnQueue(Queue Q, ElemType X); ElemType GetRearAndDeQueue(Queue Q);//初始条件:队列Q非空。 操作结果:删除队列Q的队头元素, 并返回其值  //-------------------用数组实现队列的基本操作的算法实现------------------------ Queue InitQueue(int MaxElements)//构造一个空队列 {        Queue Q;        if(MaxElements < MinQueueSize)        {               Puts("Queue size is too small!");               return NULL;        }        Q = (Queue)malloc(sizeof(struct QueueRecord));        if(!Q)        {               printf("Out of space!");               return NULL;        }        Q->Array = (ElemType*)malloc(sizeof(ElemType)*MaxElements);        if(!Q->Array)        {               printf("Out of space!");               return NULL;        }        Q->Capacity = MaxElements;        return MakeEmpty(Q); }  void DestroyQueue(Queue *Q)//初始条件:栈S已存在。 操作结果:销毁栈S。 {        free(Q->Array);        free(Q); } Queue MakeEmpty(Queue Q)//初始条件:队列Q非空。 操作结果:将队列Q重置为空队列。 {         Q->Size = 0;         Q->Rear = Q->Front;         return Q; }  int IsEmpty(Queue Q)//初始条件:队列Q已存在。 操作结果:判断队列Q是否为空队列。 {        return Q->Rear == Q->Front; //     return  Q->Size == 0;  }  int IsFull(Queue Q)//初始条件:栈S已存在。 操作结果:判断栈是否为空栈。 {        return  (Q->Rear - Q->Front == Capacity)||(Q->Rear + 1 == Q->Front); //     return  Q->Size == Q->Capacity-1; }  int QueueLength(Queue Q)//初始条件:队列Q已存在。 操作结果:返回队列Q结点的个数。 {        return Q->Size; }  //初始条件:队列Q已存在。 操作结果:插入元素X为新的队尾元素 void EnQueue(Queue Q, ElemType X) {        if(IsFull(Q))               Error("Full stack!");        else        {               if(Q->Rear > Q->Capacity-1)               {                      Q->Rear = ++Q->Rear % Q->Capacity;                      Q->Array[Q->Rear] = X;               }                   else                      Q->Array[++Q->Rear] = X;        }            }                   ElemType DeQueue(Queue Q)//初始条件:队列Q非空。 操作结果:删除队列Q的队头元素 {        if(Q->Front > Q->Capacity-1)  //如果到数组的顶,则返回数组底,循环利用数组空间               Q->Front = ++Q->Front % Q->Capacity;        else               ++Q->Front; }  ElemType GetFront(Queue Q)//初始条件:队列Q非空。 操作结果:返回队头元素的值 {        return Q->Array[Q->Front+1]; }   ElemType GetRearAndDeQueue(Queue Q)//初始条件:队列Q非空。 操作结果:删除队列Q的队头元素, 并返回其值  {        ElemType X = GetFront(Q);               DeQueue(Q);        return X; } //---------------------------------------------------------------------------------

阅读(3035) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册