队列

队列,先来先服务,先进先出

具有一定操作约束的线性表
只能在一端插入,而在另一端删除

操作集

  • Queue CreatQueue(int MaxSize):生成长度为MaxSize的队列
  • int IsFullQ(Queue Q,int MaxSize):判断队列Q是否已满
  • void AddQ(Queue Q,ElemenType item):将数据元素item插入队列
  • int IsEmptyQ(Queue Q):判断队列是否为空
  • ElementType DeleteQ(Queue Q):将队投元素从队列中删除并返回

队列顺序存储实现

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

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

环状队列

队空队满依据front和rear的值判别 front=rear时队队满或队空

//入队列
void AddQ(Queue PtrQ,ElementType item){
      if(PtrQ->rear+1) % MaxSize == PtrQ->front{
            printf("队列满");
            return ;
      }
      PtrQ->rear=(PtrQ->rear+1) % MaxSize;
      PtrQ->Data[PtrQ->rear]=item;
//出队列
ElementType DeleteQ(Queue ptrQ){
      if(PtrQ->front==PtrQ->reat){
            printf("队列空");
            return ERROR;
      }
      else{
            PtrQ->front=(PtrQ->front+1)%MaxSize;
            return PtrQ->Data[PtrQ->front];
      }
}

队列的链式存储实现

队列的链式存储结构也可以用一个单链表实现,插入和删除操作分别在链表的两头进行fornt指向链表头

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){
            printf("队列空");
            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;
posted @ 2020-07-22 19:24  小哑师兄  阅读(122)  评论(0编辑  收藏  举报