队列初识

队列

队列:只允许在一端进行插入操作,而在另一端进行删除操作的线性表,最先放入的元素能够最先被取出。(先进先出)

基本操作:

这里写图片描述
队尾(rear)入(Enqueue)
队头(front)出(Dequeue)

循环队列

1、为什么要有循环队列?
防止假溢出(数组末尾的元素被占用,但头部有位置空余,而入队的时候是一直往后加的,这样就产生了数组越界)
2、定义:队列的头尾相接的顺序存储结构成为循环队列。
3、实现方法:
font:指向队头元素
rear:指向队尾元素的下一个
QueueSize:队列的最大尺寸
空队列的判断方法:font==rear
满队列的判断方法:(rear-front+QueueSize)%QueueSize==0
4、循环队列的顺序(数组)存储结构代码

//队列结构体的定义
typedef int QElemType;
typedef struct
{
    QElemType data[MAXSIZE];
    int front;//头指针
    int rear;//尾指针
}Squeue;
//循环队列的初始化
InitQueue(SqQueue *Q)
{
    Q->font=0;
    Q->rear=0;
}
//循环队列求长度
int  QueueLength(SqQueue Q)
{
    return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
//循环队列的入队
EnQueue(SqQueue *Q,QElemType e)
{
    if((Q->rear+1)%MAXSIZE==Q->front)//判断队列是否已满
        return ERROR;
    else
    {
        Q->data[Q->rear]=e;
        Q->rear=(Q->rear+1)%MAXSIZE;//把尾指针向后移一位
    }
}
//循环队列的出队
EnQueue(SqQueue *Q,QElemType *e)
{
    if(Q->front==Q->rear)//判断队列是否为空
    {
        return ERROR;
    }
    else
    {
        *e=Q->data[Q->front]
        Q->front=(Q->front+1)%MAXSIZE;
    }
}

链式队列

这里写图片描述

这里写图片描述
front:指向头节点
rear:指向末尾数据

typedef int QElemType;

typedef struct Node
{
    QElemType data;
    struct QNode *next;
}QNode,*QueuePtr;

typedef struct
{
    QueuePtr front;
    QueuePtr rear;//指向最后一个节点
}LinkQueue;
//入队操作(在链表尾部插入节点)
EnQueue(LinkQueue *Q,QElemType e)
{
    QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
    if(s==NULL)
        exit(OVERFLOW);
    else
    {
        s->data=e;
        s->next=NULL;
        Q->rear->next=s;
        Q->rear=s;
        return OK;
    }
}
出队操作
DeQueue(LinkQueue *Q,QElemType e)
{
    QueuePtr p;
    if(Q->front==Q->rear)//判断队列是否为空
    {
        return ERROR;
    }
    if(Q->rear=p)
        Q->rear=Q->front;
    else
    {
        p=Q->front->next;//头节点的下一个
        *e=p->data;
        Q->front->next=p->next;
    }

猜你喜欢

转载自blog.csdn.net/gxyqn626/article/details/81253741