队列的简单知识点

队列的进本概念

概念:队列是一种先进先出的数据结构,他有两个开口

特点:队列先进先出 后进后出。 队头 出元素,队尾进元素

队列的顺序存储

思考:数组的首地址端做队头还是队尾
答:都一样,做对头 和队尾 差别不大 因为都需要移动大量元素

顺序存储的基础操作

顺序存储 队列的结构体
typedef struct Queue{
    int data[MAX];        //顺序存储 数组模拟的队列
    int size;            //队列的大小 (队列中元素的个数)
}QUeue,*SeqQueue;
顺序存储 队列的初始化
SeqQueue int(){
    SeqQUeue p=(Queue *)malloc(sizeof(QUeue));

    if(p==NULL){
        return NULL;
    }
    
    //初始化 队列
    p->size=0;

    for(int i=0;i<MAX;i++){
        p->data[i]=0;
    }

    return p;
}
顺序存储 队列的入队
void push(SeqQueue p,int value){
    if(p==NULL){
        printf("队列元素已满");
        return;
    }
}

    //插入元素
    p->data[p->size]=value;
顺序存储 队列的出队
void push(SeqQueue p){
    if(p==NULL){
        return;
    }
    
    if(p->size==0){
        printf("队列元素已空");
        return;
    }
    
    for(int i=0;i<p->size-1;i++){
        p->data[i]=p->data[i+1];
    }
    
    //改变元素个数
    p->size--;
}
要记得,看到循环里边 有 i+1的时候,要改变 最终值

队列的链式存储

思考:链表的头结点 做队头还是队尾
最队头好,因为 头结点 端 进行删除方便,尾端 插入元素方便(尾插法)

链式存储的基础操作

链式存储队列的结构体
//结点结构体
struct Node
{
    int data;            //数据域
    struct Node* next;  //指针域
};

//队列的结构体
typedef struct LQueue
{
    struct Node header; //头结点
    int size;  //队列大小
    struct Node* pTail; //尾结点指针
}LQueue, *LinkQueue;
链式存储 队列的初始化
LinkQueue init_LinkQueue()
{
    //创建队列结构体
    struct LQueue* myQueue = (struct LQueue*)malloc(sizeof(struct LQueue));
    if (myQueue == NULL)
    {
        return NULL;
    }

    //初始化队列
    myQueue->size = 0;
    myQueue->header.next = NULL;
    myQueue->pTail = &myQueue->header;

    return myQueue;
}
链式存储 队列的入队
void push_LinkQueue(LinkQueue queue, int data)
{
    //本质 尾插
    if (queue == NULL)
    {
        return;
    }

    //新结点
    struct Node * newNode = (struct Node *)malloc(sizeof(struct Node));
    if (!newNode)
    {
        return;
    }
    newNode->data = data;

    //更新指针的指向
    queue->pTail->next = newNode;
    newNode->next = NULL;
    queue->pTail = newNode;

    //更新队列大小
    queue->size++;
}
链式存储 队列的出队
void pop_LinkQueue(LinkQueue queue)
{
    //本质  头删
    if (queue == NULL)
    {
        return;
    }

    if (queue->size == 0)
    {
        printf("空队,无法出队\n");
        return;
    }

    //记录第一个结点
    struct Node* pFirst = queue->header.next;

    //更新指针的指向
    queue->header.next = pFirst->next;

    //释放结点
    if (pFirst != NULL)
    {
        free(pFirst);
    }

    //队列中只有一个结点的时候,再出队会影响尾指针,需要特判
    if (queue->size == 1)
    {
        queue->pTail = &queue->header;
    }

    //队列大小更新
    queue->size--;

}

循环队列

概念

将数组看成一个圆环状,当用到了数组最后的位置,再次利用数组的头部

这种队列也称为循环队列

循环队列对空和队满时的条件

//队满
front = (rear+1)%n;            //front 头  rear 尾

//对空
front = rear;                  //头指针指向尾指针为空

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值