使用c语言实现队列(图解push和pop操作&&附完整代码)

2023-11-10

相关定义和图文解释

队列是一种只能从表的一端存数据另一端取数据且遵循先进先出原则的线性存储结构。在队列的一端只能插入元素,这一端叫做队尾,另一端只能删除元素,这一端叫作队首。
在这里插入图片描述

在接下来我们使用链表来实现队列,其中我们主要看一下关于对队列的两种主要操作:其中的head指针为队列的队首,元素将从该位置出队列;其中的tail指针为队列的队尾,元素将从该位置入队;

  1. push(元素入队)
    红色为栈中元素
    在这里插入图片描述
    创建新节点 Node t = (Node*)malloc(sizeof(Node));
    然后将将tail的next指针指向新节点 queue->tail->next = t
    将新节点的next指向NULL
    在这里插入图片描述
    更新tail指针, queue->tail = t
    在这里插入图片描述
  1. pop(元素出队)
    将队列的头指针指向第一个元素的下一个节点。
    此时处于队首的第一个元素:del = queue->head->next
    从链上pop出第一个元素: queue->head = del->next
    在这里插入图片描述
    删除成功后,释放删除节点,free(del) 在这里插入图片描述

代码

函数功能描述:

  1. 创建队列 queue_create ;
  2. 释放队列 queue_destory ;
  3. 将数据插入队列 queue_push ;
  4. 将队列中的对头元素弹出 queue_pop ;
  5. 读取对头元素 queue_front ;
  6. 读取队列中的元素个数 queue_size
  7. 判断对队列是否为空 queue_empty ;
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>


typedef int  DataType;
typedef struct Node{
    DataType data;
    struct Node* next;
} Node;
typedef struct Queue{
    Node* head;
    Node* tail;
    size_t size;
} Queue;

Queue* queue_create();
void queue_destory(Queue** s);
void queue_push(Queue* s, DataType data);
DataType queue_pop(Queue* s);
DataType queue_front(const Queue* s);
size_t queue_size(const Queue* s);
bool queue_empty(const Queue* s);


Queue* queue_create(){
    Queue* s = malloc(sizeof(Queue));
    Node* dump = malloc(sizeof(Node));
    dump->next = NULL;
    s->head = dump;
    s->tail = dump;
    s->size = 0;
    return s;
}
void queue_destory(Queue** s){
    Node *p = (*s)->head;
    while(NULL!=p){
        Node* q = p->next;
        free(p);
        p = q;
    }
    free(*s);
    *s = NULL;
}
 
void queue_push(Queue* s, DataType data) {
    Node* p = malloc(sizeof(Node));
    p->data = data;
    p->next = NULL;
    s->tail->next = p;
    s->tail = p;
    s->size++;
}


DataType queue_pop(Queue* s) {
    Node* first = s->head->next;
    if(NULL == first) return 0;
    s->head->next = first->next;
    DataType res = first->data;
    free(first);
    s->size--;
    return res;
}

DataType queue_front(const Queue* s){
    if(NULL != s->head->next){
        return s->head->next->data;
    }
    return 0;
}
size_t queue_size(const Queue* s){
    return s->size;
}
bool queue_empty(const Queue* s) {
    return s->head->next == NULL;
}

int main() {
    Queue* s = queue_create();
    DataType data;
    while(EOF != scanf("%d",&data)){
        queue_push(s,data);
    }

    while(!queue_empty(s)){
        printf("%d\n",queue_pop(s));
    }
    printf("\n");
    queue_destory(&s);
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用c语言实现队列(图解push和pop操作&&附完整代码) 的相关文章

随机推荐

  • java 图片 批量 压缩 +全部压缩

    oldsrc 原图片地址文件夹 如 d newsrc 压缩后图片地址文件夹 如 e widthdist heightdist 压缩后的宽和高 createtime 2010 11 25 auto yijianfeng public void
  • 遇到的bug问题

    1 扩展板的引脚 2 Tone方法 与 红外遥控方法 发生冲突 这个错误提示表面上是说在红外库里定义过的函数在Tone里又重复定义了 实际原因是红外库和Tone都使用了相同的内部计时器TIMER2 在各自的ISR函数里 换名字是不解决根本问
  • [[机缘参悟-87]:每个人需要了解自己的性格特征(老虎、孔雀、考拉、猫头鹰、变色龙)

    我是谁 生肖天性是 老虎 生活习惯是 考拉 后天工作是 猫头鹰 最远距离是 孔雀 心理学改变 变色龙
  • http请求头部各个字段的含义

    前言 我们前几天再做http头部注入的时候 遇到了好多头部 不知道都是啥意思 今天就总结一下 HTTP头字段 英语 HTTP header fields 是指在超文本传输协议 HTTP 的请求和响应消息中的消息头部分 它们定义了一个超文本传
  • clip-path介绍

    clip path介绍 简介 兼容性 基本语法 语法详解 基本图形 inset 基本图形 circle 基本图形 ellipse 基本图形 polygon 使用示例 圆形裁剪 椭圆裁剪 矩形裁剪 多边形裁剪 三角形 菱形 梯形 平行四边形
  • rem与mod的区别

    从老师提供的PPT中复制出来的 感觉还行直接用了 算是转载吧 rem与mod的区别不仔细区分的话 可把rem和mod都当作是求余数的命令 gt gt mod 3 2 ans 1 gt gt rem 3 2 ans 1这两个数的符号一致时的结
  • 4.1-真实世界的并发

    复习 并发编程的基本工具 线程库 互斥和同步 本次课回答的问题 Q 什么样的任务是需要并行 并发的 它们应该如何实现 本次课主要内容 高性能计算中的并发编程 数据中心里的并发编程 我们身边的并发编程 一 高性能计算中的并发编程 高性能计算程
  • 【GD32】F330 串口只能返回00的问题记录

    最开始借助正点原子的视频教程在STM32mini板上跑通了串口的字节收发 但在移植程序到GD32的过程中遇到了一个bug 在b站找了GD32的串口教程手敲代码 却跟演示效果不一致 在while 1 循环里给上位机发送数据 虽然PC能够接收到
  • 使用VScode 远程访问和编辑文件

    VSCode支持远程访问编辑文件 需安装一个插件 remote browser 直接搜索安装插件即可 配置远程 文件 首选项 设置 在设置搜索remoteBrowser connectionOptions 然后编辑下方的setting js
  • PM2.5 / PM10传感器读数:Python,MicroPython和Arduino-ESP32

    在本文中 让我们看一下如何使用ESP32板连接和编写程序 从PM2 5 PM10传感器模块读取值 我们将使用Python3 用于ESP32的MicroPython和Arduino分别以代码编写为例进行演示 演示顺序如下 第一阶段 了解硬件
  • MySQL5.7和MySQL8.0的区别是什么

    MySQL5 7和MySQL8 0的区别是什么 1 MySQL5 7和MySQL8的区别 MySQL 5 7和MySQL 8 0之间有以下几个主要区别 版本功能区别 MySQL 5 7版本已经是一个非常稳定的成熟的版本 主要是针对5 7以下
  • GitHub: Support for password authentication was removed on August 13, 2021

    GitHub Support for password authentication was removed on August 13 2021 1 Description yongqiang yongqiang yongqiang wor
  • Maven 项目的 `pom.xml` 文件 标签全解析

    之前开发用Maven都是大佬们配置好的 无需自己操心 但是到了自己来搭建的时候发现自己并不是特别明白各个标签的作用 只知道dependencies里面的内容 所以痛定思痛 一定要全部搞懂所有的标签及其所起到的作用 未来不管用什么 做什么都要
  • 单链表的基本操作代码实现(C语言版)

    目录 前言 单链表的基本操作 准备工作 头文件 各种宏定义以及结构体定义 一 较简单操作 1 单链表的初始化 2 判断单链表是否为空表 3 单链表的销毁 4 单链表的清空 5 求单链表的表长 二 较重要操作 1 单链表的取值 2 单链表元素
  • 【Windows64】JAVA项目部署,生产环境搭建

    目录 1 JDK1 8安装及环境配置 2 Redis 3 2 100安装 3 Mysql5 6数据库配置安装 4 Navicat Premium 11 2 7简体中文版 5 nginx 及设置开机自启动 6 Notepad 文本编辑器 7
  • ECharts社区 合集整理

    ECharts社区 合集整理 1 PPChart 2 YX Chartlib 3 isqqw 4 makeapie 5 Chart Top 1 PPChart 网址 http ppchart com 2 YX Chartlib 网址 htt
  • servlet:web.xml中使用entity引入其他xml文件时发生了错误-java.io.FileNotFoundException: Could not resolve XML

    参考原文 CSDN Tomcat运行报错 Could not resolve XML resource null with public ID null system ID https blog csdn net weixin 446514
  • 连接不到系统数据库服务器,连接不到系统数据库服务器

    连接不到系统数据库服务器 内容精选 换一换 云数据库RDS服务端可能出现的问题如下 请依次进行检测 连接方式有误 解决方法 检查连接方式 弹性云服务器与云数据库RDS实例必须处于同一虚拟私有云内 且只能通过弹性云服务器连接 解决方法 检查连
  • SQL注入之基于报错的注入

    目录 1 GET单引号字符型 2 GET数字型 3 GET单引号加括号字符型 4 GET双引号字符型 5 注入利用 5 1利用order by判断字段 5 2利用联合查询查找信息 1 GET单引号字符型 首先我们打开搭建好的sqli lab
  • 使用c语言实现队列(图解push和pop操作&&附完整代码)

    相关定义和图文解释 队列是一种只能从表的一端存数据另一端取数据且遵循先进先出原则的线性存储结构 在队列的一端只能插入元素 这一端叫做队尾 另一端只能删除元素 这一端叫作队首 在接下来我们使用链表来实现队列 其中我们主要看一下关于对队列的两种