当前位置: 首页 > news >正文

数据结构与算法-队列

参考学习:B站-逊哥带你学编程

队列的定义与实现

在这里插入图片描述

队列的顺序结构实现

#define MAXSIZE 100
typedef int ElemType;

typedef struct
{
    ElemType data[MAXSIZE];
    int front;
    int rear;
}Queue;

图示:

在这里插入图片描述

队列的顺序结构-初始化

void initQueue(Queue *Q)
{
    Q->front = 0;
    Q->rear = 0;
}

队列的顺序结构-判断队列是否为空

int isEmpty(Queue *Q)
{
    if(Q->front == Q->rear)
    {
        printf("Queue is empty\n");
        return 1;
    }
    return 0;
}

图示:

在这里插入图片描述

队列的顺序结构-出队

ElemType dequeue(Queue *Q)
{
    if(Q->front == Q->rear) //队列为空
    {
        printf("Queue is empty\n"); //队列为空
        return 0;
    }
    ElemType e = Q->data[Q->front]; //取出队头元素
    Q->front++; //队头指针后移
    return e; //返回队头元素
}

图示:

在这里插入图片描述

队列的顺序结构-入队

int queueFull(Queue *Q)
{
    if(Q->front > 0)
    {
        int step = Q->front;
        for(int i=Q ->front; i<=Q->rear; i++)
        {
            Q->data[i-step] = Q->data[i];
        }
        Q->front = 0;
        Q->rear = Q->rear - step;
        return 1;
    }
    else
    {
        printf("Queue is full\n"); //队列已满
        return 0;
    }
}

int enqueue(Queue *Q, ElemType e)
{
    if(Q->rear >= MAXSIZE) 
    {
        if(!queueFull(Q)) //队列已满
        {
            printf("Queue is full\n"); //队列已满
            return 0;
        }
        
    }
    Q->data[Q->rear] = e; //入队
    Q->rear++; //队尾指针后移
    return 1;
}


队列的顺序结构-获取队头数据

int getFront(Queue *Q, ElemType *e)
{
    if(Q->front == Q->rear) //队列为空
    {
        printf("Queue is empty\n"); //队列为空
        return 0;
    }
    *e = Q->data[Q->front]; //取出队头元素
    return 1;
}

队列的顺序结构-动态内存分配

typedef struct
{
    ElemType *data;
    int front;
    int rear;
}Queue;

Queue *initQueue()
{
    Queue *Q = (Queue *)malloc(sizeof(Queue));
    Q->data = (ElemType *)malloc(sizeof(ElemType)*MAXSIZE);
    Q->front = 0;
    Q->rear = 0;
    return Q;
}

队列的顺序结构-循环队列-入队

int equeue(Queue *Q, ElemType e)
{
    if((Q->rear + 1 ) % MAXSIZE == Q->front) //队列已满
    {
        printf("Queue is full\n");
        return 0;
    }
    Q->data[Q->rear] = e; //入队
    Q->rear = (Q->rear + 1) % MAXSIZE; //队尾指针后移
    return 1;
}

队列的顺序结构-循环队列-出队

int dequeue(Queue *Q, ElemType *e)
{
    if(Q->front == Q->rear) //队列为空
    {
        printf("Queue is empty\n"); //队列为空
        return 0;
    }
    *e = Q->data[Q->front]; //取出队头元素
    Q->front = (Q->front + 1) % MAXSIZE; //队头指针后移
    return 1;
}

队列的链式结构

在这里插入图片描述

队列的链式结构-初始化

typedef struct QueueNode
{
    ElemType data;
    struct QueueNode *next;
}QueueNode;

typedef struct
{
    QueueNode *front;
    QueueNode *rear;
}Queue;

Queue *initQueue()
{
    Queue *Q = (Queue *)malloc(sizeof(Queue));
    QueueNode *node = (QueueNode *)malloc(sizeof(QueueNode));
    node->data = 0;
    node->next = NULL;
    Q->front = node;
    Q->rear = node;
    return Q;
}

队列的链式结构-判断队列是否为空

int isEmpty(Queue *Q)
{
    if(Q->front == Q->rear)
    {
        printf("Queue is empty\n");
        return 1;
    }
    return 0;
}

队列的链式结构-入队

可以使用链表的头插法或尾插法。

在这里插入图片描述

使用尾插法:

void equeue(Queue *Q, ElemType e)
{
    QueueNode *node = (QueueNode *)malloc(sizeof(QueueNode)); //分配内存
    node->data = e; //赋值
    node->next = NULL; //指向空
    Q->rear->next = node; //队尾节点指向新节点
    Q->rear = node; //新节点为队尾节点
}

队列的链式结构-出队

int dequeue(Queue *q, ElemType *e)
{
    QueueNode *node = q->front->next; //指向队头节点
    *e = node->data; //保存队头节点的值
    q->front->next = node->next; //队头节点指向下一个节点
    if(q->rear == node) //若队尾节点为队头节点
    {
        q->rear = q->front; //队尾节点指向队头节点
    }
    free(node); //释放内存
    return 1;
}

队列的链式结构-获取队头元素

ElemType getFront(Queue *Q)
{
    if(Q->front == Q->rear)
    {
        printf("Queue is empty\n");
        return 0;
    }
    return Q->front->next->data; //返回队头元素
}

双端队列

在这里插入图片描述

相关文章:

  • 探索未来科技:AIP智能体平台引领人工智能新纪元
  • 企业级高可用 Kubernetes 实践:基于青云 LB 搭建容灾与负载均衡集群全攻略
  • Linux性能分析工具Trace使用
  • nuxt中引入element-ui组件控制台报错问题
  • 对openharmony HDF驱动框架的C/S设计模式和单例类的说明
  • 【设计模式】-工厂模式(简单工厂、工厂方法、抽象工厂)
  • flask和django的对比
  • ECCV2022 | LGV | LGV:利用大几何邻域提升对抗样本的可迁移性
  • Vue2组件通信
  • 工作流改造:从一到千
  • 网络安全用centos干嘛 网络安全需要学linux吗
  • DBSCAN 基于密度的空间带噪聚类法
  • LM Studio纯CPU运行大模型不如ollama效率高
  • jenkins服务启动-排错
  • 数组_二分查找
  • Android-构建问题记录
  • Java版PDF拼接
  • 配查查:解锁商业奥秘,赋能智慧决策
  • OpenEuler学习笔记(三十二):在OpenEuler上搭建项目管理平台
  • django静态文件配置
  • 国家统计局:中美大幅降低关税有利于双方贸易增长,也有利于世界经济复苏
  • 山东发布高温橙警:预计19日至21日局地可达40℃
  • “上海-日喀则”援藏入境旅游包机在沪首航
  • 大学2025丨北大教授陈平原:当卷不过AI时,何处是归途
  • 雅安市纪委监委回应黄杨钿甜耳环事件:相关政府部门正在处理
  • 上海国际珠宝时尚功能区未来三年如何建设?六大行动将开展