队列


类型名称:队列

数据对象集:一个有0个或多个元素的又穷线性表。

操作集:长度为MaxSize的队列Q€Queue,队列元素item€ElementType

1,Queue CreatQueue(int MaxSize):生成长度为MaxSize的空队列;

2,int IsFaultQ(Queue Q,int MaxSize):判断队列Q是否已满;

3,void AddQ(Queue Q,ElementType item):将数据元素item插入队列Q中;

4,int IsEmpteyQ(Queue Q):判断队列Q是否为空;

5,ElementType DeleteQ(Queue Q):将队头数据元素从队列中删除并返回

 队列的顺序存储实现

队列的顺序存储结构通常由一个一维数组和一个记录队列头元素位置的变量front以及一个记录队列对位元素位置的变量rear组成;

front指向队列头元素的前一个,加一个元素rear+1,删除一个元素 front+1

#define MaxSize<储存数据元素的最大个数>
struce QNode{
          ElementType Data [MaxSize];
          int rear;
          int front;
};
typedef struct QNode *Queue;

顺环队列:

front==rear时,队列是空还是满?数组大小为n是,队列装载元素的状态有n+1种,而front和rear之间的差距只有n种。

解决方案:增加一个额外的标记 Size 或者tag域;

仅使用n-1个数组空间;

(1)入队列

void AddQ(Queue PtrQ,ElementType item)
{
     if((PtrQ->rear+1)%MaxSize==PtrQ->front){
        print("队列满“);
         return;
        }
      PtrQ->rear=(PtrQ->rear+1)%MaxSize;
      PtrQ->Data[PtrQ->rear]=item;
}

(2)出队列

ElementType DeleteQ(Queue PtrQ)
{
      if(PtrQ->front==PtrQ->rear)
     {
         print("队列空”);
         return ERROR;
       }
      else
      {
       PtrQ->front=(PtrQ->front+1)%MaxSize;
       return PtrQ->Data[PtrQ->front];
       }
}

队列的链式存储及实现

队列的链式存储结构也可以用一个单链表实现。插入和删除操作分别在链表的两头进行;队列指针front和rear应该分别指向链表的哪一头?

struct Node{
       ElementType Data;
       struct Node *Next;
 };
struct  QNode{  /*链队列结构*/
         struct Node *rear;   /*指向队尾结点*/
         struct Node *front;  /*指向队头结点*/
 };
 typedef struct QNode *Queue;
Queue  PtrQ;

*不带头结点的链式队列出队操作的一个示例:

ElementType DeleteQ(Queue PtrQ)
{ struct Node *FrontCell;
   ElementType FrontElem;
     if(PtrQ->front==NULL)
     {
      print("队列空“);
       return ERROR;
      }
     FrontCell=PtrQ->front;
     if(PtrQ->front==PtrQ->rear)  /*若队列只有一个元素*/
           PtrQ->front=PtrQ->rear=NULL; /*删除后队列置空*/
      else
            PtrQ->front=PtrQ->front->Next;
       FrontElem=FrontCell->Data;
       free(FrontCell);            /*释放被删除的结点*/
       return FrontElem;
}