队列

队列

队列(Queue):具有一定操作约束的线性表

  • 插入和删除操作:只能在一端插入,而在另一端删除

  • 数据插入:入队(AddQ)

  • 数据删除:出队列(DeleteQ)

  • 先来先服务

  • 先进先出:FIFO

类型名称:队列(Queue)

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

操作集:长度为MaxSize得队列\(Q\in Queue\),队列元素\(item\in ElementType\)

  1. Queue CreateQueue(int MaxSize):生成长度为MaxSize的空队列
  2. int IsFullQ(Queue Q, int MaxSize):判断队列Q是否已满
  3. void AddQ(Queue Q, ElementType item):将数据元素item插入队列Q中
  4. int IsEmptyQ(Queue Q):判断队列Q是否为空
  5. ElementType DeleteQ(Queue Q):将队头数据元素从队列中删除并返回

队列的顺序存储实现

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

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

顺环队列

入队列

void AddQ(Queue PtrQ, ElementType item){//队列不全放满,最多放n-1个元素
    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->rear){
        printf("队列空");
        return ERROR;
    }
    else{
        PtrQ->front = (PtrQ->front+1) % MaxSize; //到最后一位加1求余为0,来实现顺环
        return PtrQ->Data[PtrQ->front]
    }
}

队列的链式存储实现

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

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 == NULL; //删除后置队列为空
    else
        PtrQ->front = PtrQ->front->Next;
    FrontElem = FromtCell->Data;
    free(FrontCell); //释放被删除节点空间
    return FrontElem;
}

入队操作:

void AddQ(Queue PtrQ, ElementType item){
    struct Node *s;
    s = (Queue)malloc(sizeof(struct Node)); //为新的数据开辟一个空间
    s->Data = item; //将数据放入新开辟的节点中
    PtrQ->rear = s; //尾巴指向新开辟的结点
    return;
    }
}
posted @ 2022-03-04 21:00  里列昂遗失的记事本  阅读(27)  评论(0编辑  收藏  举报