C语言算法之队列快速入门教程

队列结构

queue.h

#ifndef ZDPC_ALGORITHM_DEV_QUEUE_H
#define ZDPC_ALGORITHM_DEV_QUEUE_H

// 队列
typedef struct queue {
    int *arr; // 容器
    int cap; // 容量
    int size; // 元素个数
    int front; // 队首,用于出队
    int tail // 队尾,用于入队
} Queue;

#endif //ZDPC_ALGORITHM_DEV_QUEUE_H

新建队列

核心代码:

Queue *newQueue(int cap) {
    // 申请队列内存
    Queue *queue = malloc(sizeof(Queue) * cap);

    // 申请容器内存
    queue->arr = malloc(sizeof(int) * cap);

    // 其他属性
    queue->cap = cap;
    queue->size = 0;
    queue->front = 0;
    queue->tail = 0;

    // 返回
    return queue;
}

queue.h

#ifndef ZDPC_ALGORITHM_DEV_QUEUE_H
#define ZDPC_ALGORITHM_DEV_QUEUE_H

// 公共头文件
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

// 队列
typedef struct queue {
    int *arr; // 容器
    int cap; // 容量
    int size; // 元素个数
    int front; // 队首,用于出队
    int tail; // 队尾,用于入队
} Queue;

extern Queue *newQueue(int cap); // 创建队列

#endif //ZDPC_ALGORITHM_DEV_QUEUE_H

queue.c

#include "queue.h"

// 新建队列
Queue *newQueue(int cap) {
    // 申请队列内存
    Queue *queue = malloc(sizeof(Queue) * cap);

    // 申请容器内存
    queue->arr = malloc(sizeof(int) * cap);

    // 其他属性
    queue->cap = cap;
    queue->size = 0;
    queue->front = 0;
    queue->tail = 0;

    // 返回
    return queue;
}

释放队列

核心代码:

void freeQueue(Queue *queue) {
    if (queue == NULL) {
        return;
    }
    free(queue->arr);
    free(queue);
}

queue.h

#ifndef ZDPC_ALGORITHM_DEV_QUEUE_H
#define ZDPC_ALGORITHM_DEV_QUEUE_H

// 公共头文件
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

// 队列
typedef struct queue {
    int *arr; // 容器
    int cap; // 容量
    int size; // 元素个数
    int front; // 队首,用于出队
    int tail; // 队尾,用于入队
} Queue;

extern Queue *newQueue(int cap); // 创建队列
extern void freeQueue(Queue *queue); // 释放队列

#endif //ZDPC_ALGORITHM_DEV_QUEUE_H

queue.c

#include "queue.h"

// 新建队列
Queue *newQueue(int cap) {
    // 申请队列内存
    Queue *queue = malloc(sizeof(Queue) * cap);

    // 申请容器内存
    queue->arr = malloc(sizeof(int) * cap);

    // 其他属性
    queue->cap = cap;
    queue->size = 0;
    queue->front = 0;
    queue->tail = 0;

    // 返回
    return queue;
}

// 释放队列
void freeQueue(Queue *queue) {
    if (queue == NULL) {
        return;
    }
    free(queue->arr);
    free(queue);
}

判断队列是否已满

核心代码:

int isFullQueue(Queue *queue) {
    if (queue == NULL) {
        return 0;
    }
    return queue->size >= queue->cap;
}

queue.h

#ifndef ZDPC_ALGORITHM_DEV_QUEUE_H
#define ZDPC_ALGORITHM_DEV_QUEUE_H

// 公共头文件
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

// 队列
typedef struct queue {
    int *arr; // 容器
    int cap; // 容量
    int size; // 元素个数
    int front; // 队首,用于出队
    int tail; // 队尾,用于入队
} Queue;

extern Queue *newQueue(int cap); // 创建队列
extern void freeQueue(Queue *queue); // 释放队列
extern int isFullQueue(Queue *queue); // 判断队列是否已满

#endif //ZDPC_ALGORITHM_DEV_QUEUE_H

queue.c

#include "queue.h"

// 新建队列
Queue *newQueue(int cap) {
    // 申请队列内存
    Queue *queue = malloc(sizeof(Queue) * cap);

    // 申请容器内存
    queue->arr = malloc(sizeof(int) * cap);

    // 其他属性
    queue->cap = cap;
    queue->size = 0;
    queue->front = 0;
    queue->tail = 0;

    // 返回
    return queue;
}

// 释放队列
void freeQueue(Queue *queue) {
    if (queue == NULL) {
        return;
    }
    free(queue->arr);
    free(queue);
}

// 判断队列是否已满
int isFullQueue(Queue *queue) {
    if (queue == NULL) {
        return 0;
    }
    return queue->size >= queue->cap;
}

判断队列是否为空

核心代码:

int isEmptyQueue(Queue *queue) {
    if (queue == NULL) {
        return 0;
    }
    return queue->size <= 0;
}

queue.h

#ifndef ZDPC_ALGORITHM_DEV_QUEUE_H
#define ZDPC_ALGORITHM_DEV_QUEUE_H

// 公共头文件
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

// 队列
typedef struct queue {
    int *arr; // 容器
    int cap; // 容量
    int size; // 元素个数
    int front; // 队首,用于出队
    int tail; // 队尾,用于入队
} Queue;

extern Queue *newQueue(int cap); // 创建队列
extern void freeQueue(Queue *queue); // 释放队列
extern int isFullQueue(Queue *queue); // 判断队列是否已满
extern int isEmptyQueue(Queue *queue); // 判断队列是否为空

#endif //ZDPC_ALGORITHM_DEV_QUEUE_H

queue.c

#include "queue.h"

// 新建队列
Queue *newQueue(int cap) {
    // 申请队列内存
    Queue *queue = malloc(sizeof(Queue) * cap);

    // 申请容器内存
    queue->arr = malloc(sizeof(int) * cap);

    // 其他属性
    queue->cap = cap;
    queue->size = 0;
    queue->front = 0;
    queue->tail = 0;

    // 返回
    return queue;
}

// 释放队列
void freeQueue(Queue *queue) {
    if (queue == NULL) {
        return;
    }
    free(queue->arr);
    free(queue);
}

// 判断队列是否已满
int isFullQueue(Queue *queue) {
    if (queue == NULL) {
        return 0;
    }
    return queue->size >= queue->cap;
}

// 判断队列是否为空
int isEmptyQueue(Queue *queue) {
    if (queue == NULL) {
        return 0;
    }
    return queue->size <= 0;
}

入队

核心代码:

void enQueue(Queue *queue, int value) {
    if (isFullQueue(queue)) {
        printf("queue is full\n");
        return;
    }
    if (queue->tail >= queue->cap) {
        queue->tail = 0;// 循环队列
    }
    queue->arr[queue->tail] = value;
    queue->tail++;
    queue->size++;
}

queue.h

#ifndef ZDPC_ALGORITHM_DEV_QUEUE_H
#define ZDPC_ALGORITHM_DEV_QUEUE_H

// 公共头文件
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

// 队列
typedef struct queue {
    int *arr; // 容器
    int cap; // 容量
    int size; // 元素个数
    int front; // 队首,用于出队
    int tail; // 队尾,用于入队
} Queue;

extern Queue *newQueue(int cap); // 创建队列
extern void freeQueue(Queue *queue); // 释放队列
extern int isFullQueue(Queue *queue); // 判断队列是否已满
extern int isEmptyQueue(Queue *queue); // 判断队列是否为空
extern void enQueue(Queue *queue, int value); // 入队
extern void deQueue(Queue *queue); // 出队

#endif //ZDPC_ALGORITHM_DEV_QUEUE_H

queue.c

#include "queue.h"

// 新建队列
Queue *newQueue(int cap) {
    // 申请队列内存
    Queue *queue = malloc(sizeof(Queue) * cap);

    // 申请容器内存
    queue->arr = malloc(sizeof(int) * cap);

    // 其他属性
    queue->cap = cap;
    queue->size = 0;
    queue->front = 0;
    queue->tail = 0;

    // 返回
    return queue;
}

// 释放队列
void freeQueue(Queue *queue) {
    if (queue == NULL) {
        return;
    }
    free(queue->arr);
    free(queue);
}

// 判断队列是否已满
int isFullQueue(Queue *queue) {
    if (queue == NULL) {
        return 0;
    }
    return queue->size >= queue->cap;
}

// 判断队列是否为空
int isEmptyQueue(Queue *queue) {
    if (queue == NULL) {
        return 0;
    }
    return queue->size <= 0;
}

// 入队
void enQueue(Queue *queue, int value) {
    if (isFullQueue(queue)) {
        printf("queue is full\n");
        return;
    }
    if (queue->tail >= queue->cap) {
        queue->tail = 0;// 循环队列
    }
    queue->arr[queue->tail] = value;
    queue->tail++;
    queue->size++;
}

出队

核心代码:

int deQueue(Queue *queue) {
    if (isEmptyQueue(queue)) {
        printf("queue is empty\n");
        return -1;
    }
    if (queue->front >= queue->cap) {
        queue->front = 0;// 循环队列
    }

    // 取值
    int value = queue->arr[queue->front];
    queue->front++;
    queue->size--;

    // 返回
    return value;
}

queue.h

#ifndef ZDPC_ALGORITHM_DEV_QUEUE_H
#define ZDPC_ALGORITHM_DEV_QUEUE_H

// 公共头文件
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

// 队列
typedef struct queue {
    int *arr; // 容器
    int cap; // 容量
    int size; // 元素个数
    int front; // 队首,用于出队
    int tail; // 队尾,用于入队
} Queue;

extern Queue *newQueue(int cap); // 创建队列
extern void freeQueue(Queue *queue); // 释放队列
extern int isFullQueue(Queue *queue); // 判断队列是否已满
extern int isEmptyQueue(Queue *queue); // 判断队列是否为空
extern void enQueue(Queue *queue, int value); // 入队
extern int deQueue(Queue *queue); // 出队

#endif //ZDPC_ALGORITHM_DEV_QUEUE_H

queue.c

#include "queue.h"

// 新建队列
Queue *newQueue(int cap) {
    // 申请队列内存
    Queue *queue = malloc(sizeof(Queue) * cap);

    // 申请容器内存
    queue->arr = malloc(sizeof(int) * cap);

    // 其他属性
    queue->cap = cap;
    queue->size = 0;
    queue->front = 0;
    queue->tail = 0;

    // 返回
    return queue;
}

// 释放队列
void freeQueue(Queue *queue) {
    if (queue == NULL) {
        return;
    }
    free(queue->arr);
    free(queue);
}

// 判断队列是否已满
int isFullQueue(Queue *queue) {
    if (queue == NULL) {
        return 0;
    }
    return queue->size >= queue->cap;
}

// 判断队列是否为空
int isEmptyQueue(Queue *queue) {
    if (queue == NULL) {
        return 0;
    }
    return queue->size <= 0;
}

// 入队
void enQueue(Queue *queue, int value) {
    if (isFullQueue(queue)) {
        printf("queue is full\n");
        return;
    }
    if (queue->tail >= queue->cap) {
        queue->tail = 0;// 循环队列
    }
    queue->arr[queue->tail] = value;
    queue->tail++;
    queue->size++;
}

// 出队
int deQueue(Queue *queue) {
    if (isEmptyQueue(queue)) {
        printf("queue is empty\n");
        return -1;
    }
    if (queue->front >= queue->cap) {
        queue->front = 0;// 循环队列
    }

    // 取值
    int value = queue->arr[queue->front];
    queue->front++;
    queue->size--;

    // 返回
    return value;
}

队列的基本使用

main.c

#include <stdio.h>
#include "queue.h"

int main(void) {
    // 创建队列
    Queue *queue = newQueue(2);

    // 入队
    enQueue(queue, 11);
    enQueue(queue, 22);
    enQueue(queue, 33); // 队列满了

    // 出队
    printf("%d\n", deQueue(queue));
    printf("%d\n", deQueue(queue));
    printf("%d\n", deQueue(queue)); // 队列空了

    return 0;
}

输出:

queue is full
11
22
queue is empty
-1

队列交替入队和出队

main.c

#include <stdio.h>
#include "queue.h"

int main(void) {
    // 创建队列
    Queue *queue = newQueue(2);

    // 入队
    enQueue(queue, 11);
    enQueue(queue, 22);
    printf("%d\n", deQueue(queue));

    enQueue(queue, 33); // 循环队列
    printf("%d\n", deQueue(queue));
    printf("%d\n", deQueue(queue));

    // 入队
    enQueue(queue, 11);
    enQueue(queue, 22);
    printf("%d\n", deQueue(queue));

    enQueue(queue, 33); // 循环队列
    printf("%d\n", deQueue(queue));
    printf("%d\n", deQueue(queue));

    return 0;
}

输出:

11
22
33
11
22
33

遍历队列

main.c

#include <stdio.h>
#include "queue.h"

int main(void) {
    // 创建队列
    Queue *queue = newQueue(2);

    // 入队
    enQueue(queue, 11);
    enQueue(queue, 22);
    printf("cap=%d size=%d\n", queue->cap, queue->size);

    // 遍历队列
    while (!isEmptyQueue(queue)) {
        printf("%d\n", deQueue(queue));
    }
    printf("cap=%d size=%d\n", queue->cap, queue->size);

    return 0;
}

输出:

cap=2 size=2
11
22
cap=2 size=0

重要:别忘了释放内存!!!

main.c

#include <stdio.h>
#include "queue.h"

int main(void) {
    // 创建队列
    Queue *queue = newQueue(2);

    // 入队
    enQueue(queue, 11);
    enQueue(queue, 22);
    printf("cap=%d size=%d\n", queue->cap, queue->size);

    // 遍历队列
    while (!isEmptyQueue(queue)) {
        printf("%d\n", deQueue(queue));
    }
    printf("cap=%d size=%d\n", queue->cap, queue->size);

    // 别忘了释放内存
    freeQueue(queue);

    return 0;
}

输出:

cap=2 size=2
11
22
cap=2 size=0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/611240.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CellChat包文献介绍

Inference and analysis of cell-cell communication using CellChat - PubMed (nih.gov) 目录 在线数据 摘要 基础介绍 分析结果 1&#xff0c;概述 2&#xff0c;识别预测通路 3&#xff0c;连续的信号转导 4&#xff0c;预测空间共定位细胞群之间的关键信号转导事件…

企业活动想联系媒体报道宣传如何联系媒体?

在企业的宣传推广工作中,我曾经历过一段费事费力、效率极低的时期。那时,每当公司有重要活动或新项目需要媒体报道时,我便要一家家地联系媒体,发送邮件、打电话,甚至亲自登门拜访,只为求得一篇报道。然而,这样的过程充满了不确定性和挑战,时常让我感到焦虑和压力山大。 记得有一…

vue3专栏项目 -- 项目介绍以及准备工作

这是vue3TS的项目&#xff0c;是一个类似知乎的网站&#xff0c;可以展示专栏和文章的详情&#xff0c;可以登录、注册用户&#xff0c;可以创建、删除、修改文章&#xff0c;可以上传图片等等。 这个项目全部采用Composition API 编写&#xff0c;并且使用了TypeScript&#…

亚马逊产品排名提升全攻略:自养号测评干货

之前我们一同探讨了亚马逊产品排名的多种类型&#xff0c;现在让我们回到正题&#xff0c;探讨一下如何才能有效地提升产品排名&#xff0c;从而吸引并抓住平台的流量&#xff0c;最终将其转化为可观的销量。 首先&#xff0c;卖家必须明晰亚马逊的排名机制&#xff0c;它主要基…

网页版Figma汉化

最近学习Figma&#xff0c;简单介绍一下网页版Figma的汉化方法 1.打开网址&#xff1a;Figma软件汉化-Figma中文版下载-Figma中文社区 2.下载汉化插件离线包 解压汉化包 3.点开谷歌的管理扩展程序 4.点击加载已解压的扩展程序&#xff0c;选择刚刚解压的包 这样就安装好了汉化…

从0到1开发一个vue3+ts项目(一)

1. 环境配置 1.1 安装node 使用官方安装程序 前往 Node.js 官网&#xff1a;访问 Node.js 官网&#xff0c;下载适合你操作系统的安装程序。运行安装程序&#xff1a;下载完成后&#xff0c;双击安装程序并按照提示进行安装。验证安装&#xff1a;安装完成后&#xff0c;在终…

顺序表经典算法OJ题-- 力扣27,88

题1&#xff1a; 移除元素 题2&#xff1a; 合并两个有序数组 一&#xff1a;题目链接&#xff1a;. - 力扣&#xff08;LetCode&#xff09; 思路&#xff1a;&#xff08;双指针法&#xff09; 创建两个变量src&#xff0c;dst 1&#xff09;若src指向的值为val&#xf…

Qt复习第二天

1、菜单栏工具栏状态栏 #include "mainwindow.h" #include "ui_mainwindow.h" #pragma execution_character_set("utf-8"); MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);//菜…

粤嵌—2024/4/26—跳跃游戏 ||

代码实现&#xff1a; 方法一&#xff1a;回溯 历史答案剪枝优化——超时 int *dis;void dfs(int k, int startindex, int *nums, int numsSize) {if (dis[startindex] < k) {return;}dis[startindex] k;for (int i 0; i < nums[startindex]; i) {if (startindex i &…

嫁接打印的技术要点

所谓嫁接打印&#xff0c;是一种增减材混合制造的方式。它将已成形的模具零件当作基座&#xff0c;在此基础上“生长”出打印的零件。其中基座通常采用传统加工方式制造&#xff0c;而打印部分则使用专用的金属粉末&#xff0c;通过 3D 打印技术成型。 嫁接打印之所以备受欢迎&…

4.nginx.pid打开失败以及失效的解决方案

一. nginx.pid打开失败以及失效的解决方案 1.错误图片&#xff1a; 2.解决方法 步骤1&#xff1a;进入这个目录 /var/run/nginx,提示没有文件或目录&#xff0c;则使用mkdir创建这个目录。 步骤2&#xff1a;然后 ./nginx -s reload 运行,是一个无效的PID 步骤3&#xff1a;使…

SMI接口

目录 SMI 接口帧格式读时序写时序 IP 设计IP 例化界面IP 接口IP 验证 SMI 接口 SMI&#xff08;Serial Management Interface&#xff09;串行管理接口&#xff0c;也被称作 MII 管理接口&#xff08;MII Management Interface&#xff09;&#xff0c;包括 MDC 和 MDIO 两条信…

【字符串】Leetcode 二进制求和

题目讲解 67. 二进制求和 算法讲解 为了方便计算&#xff0c;我们将两个字符串的长度弄成一样的&#xff0c;在短的字符串前面添加字符0&#xff1b;我们从后往前计算&#xff0c;当遇到当前计算出来的字符是> 2’的&#xff0c;那么就需要往前面进位和求余 注意&#xf…

《QT实用小工具·六十二》基于QT实现贝塞尔曲线画炫酷的波浪动画

1、概述 源码放在文章末尾 该项目实现了通过贝塞尔曲线画波浪动画&#xff0c;可控制 颜色密度速度加速度 安装与运行环境 语言&#xff1a;C 框架&#xff1a;Qt 11.3 平台&#xff1a;Windows 将屏幕水平平均分为10块&#xff0c;在一定范围内随机高度的12个点&#xff08;…

OAuth 2.0 和 OAuth 2.1

OAuth 2.0 和 OAuth 2.1比较&#xff1a; OAuth 2.0 和 OAuth 2.1 是授权框架的不同版本&#xff0c;它们用于允许应用程序安全地访问用户在另一个服务上的数据。以下是它们之间的一些主要区别&#xff1a; 安全性增强&#xff1a;OAuth 2.1 旨在提高安全性&#xff0c;它整合…

C语言/数据结构——每日一题(移除链表元素)

一.前言 今天在leetcode刷到了一道关于单链表的题。想着和大家分享一下。废话不多说&#xff0c;让我们开始今天的知识分享吧。 二.正文 1.1题目要求 1.2思路剖析 我们可以创建一个新的单链表&#xff0c;然后通过对原单链表的遍历&#xff0c;将数据不等于val的节点移到新…

MySQL索引(聚簇索引、非聚簇索引)

了解MySQL索引详细&#xff0c;本文只做整理归纳&#xff1a;https://blog.csdn.net/wangfeijiu/article/details/113409719 概念 索引是对数据库表中一列或多列的值进行排序的一种结构&#xff0c;使用索引可快速访问数据库表中的特定信息。 索引分类 主键索引&#xff1a…

微信群发用什么软件最安全?微信群发软件哪个好?微信群发助手软件在哪里?

今天给大家推荐一款我们目前在使用的电脑群发工具掘金小蜜&#xff0c;不仅可以无限多开&#xff0c;方便你同时管理多个账号&#xff0c;群发功能更是十分强大&#xff0c;轻松释放你的双手。 掘金小蜜&#xff08;只支持Win7及以上操作系统&#xff0c;没有推Mac版和手机客户…

【算法入门赛】B. 自助店评分(C++、STL、推荐学习)题解与代码

比赛地址&#xff1a;https://www.starrycoding.com/contest/8 题目描述 在上一场的入门教育赛中&#xff0c;牢 e e e找到了所有自助店的位置&#xff0c;但是他想发现一些“高分好店”&#xff0c;于是他利用爬虫技术从“小众点评APP”中爬取了武汉所有自助店的评分。 评分…

[笔试训练](十八)

目录 052:字符串压缩 053:chika和蜜柑 054:01背包 052:字符串压缩 压缩字符串(一)_牛客题霸_牛客网 (nowcoder.com) 题目&#xff1a; 题解&#xff1a; 双指针模拟 class Solution { public:string compressString(string param) {int nparam.size();string ret;int num…
最新文章