栈和队列详解(2)

目录

一、什么是队列?

二、创建一个我们自己的队列

1.前置准备

1.1需要的三个文件

  1.2结构体的创建和头文件的引用

2.接口的实现

2.1初始化队列

2.2入队

2.3队列元素个数和判空

 2.4取队头元素和队尾元素

 2.5出队

 2.6摧毁队列

2.7测试接口

 三、所有代码

1.接口实现

2.队列的头文件

3.测试代码


一、什么是队列?

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。可以形象地将队列想象成生活中的挤地铁,在挤地铁的时候我们只能够从后面进入队伍,出也只能够从队头出到地铁。总结:队列是只支持尾插头删的线性表。 

 二、创建一个我们自己的队列

1.前置准备

1.1需要的三个文件

在开始之前,我们最好创建三个文件,一个放栈函数的实现,一个用来测试栈函数,最后一个放栈函数的引用和头文件的引用,这样到时侯想要使用栈函数直接包这一个头文件即可。创建完之后,呈现出来的效果与下图差不多即可。

  1.2结构体的创建和头文件的引用

由于队列需要头删,使用数组实现的话最终呈现出来的效率十分低下,我们这里使用链表的方式实现,使用链表来实现线性表,头和尾是经常要用到的,同样队列的长度也很重要。因此我们创建两个结构体变量,一个结构体变量为链表的节点,一个结构体变量存放链表的头和尾以及队列的长度。

最终呈现出来的结果是这样的 

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int QueDateType;
//到时修改类型时只用改这里的一个就可以,不需要一个个修改
//同样,这也是为了和单一的int作区分
typedef struct QueueListNode
{struct QueueListnode* next;//存放下一个节点QueDateType data;//存放当前节点的数据
}Quenode;
typedef struct QueueInformation
{Quenode* head;//存放头节点Quenode* tail;//存放尾节点int sz;//存放个数
}Que;

2.接口的实现

2.1初始化队列

没什么好说的,将队列的两个指针变为空,存放个数的变量变为0即可

void init_queue(Que* q1)
{assert(q1);//q1存放的是结构体的指针,不应为空,为空操作不了q1->head = NULL;q1->tail = NULL;q1->sz = 0;
}

2.2入队

void push_queue(Que* q1, QueDateType x)
{assert(q1);//创建一个新节点,并初始化Quenode* newnode = (Quenode*)malloc(sizeof(Quenode));	if (newnode == NULL){perror("push_queue");exit(-1);}newnode->next = NULL;newnode->data = x;if (q1->head == NULL)//如果头为空,意味着还没有节点,单独处理{q1->head = q1->tail = newnode;}else{q1->tail->next = newnode;//原来的尾链接上新的尾q1->tail = newnode;//将尾更新}q1->sz++;
}

2.3队列元素个数和判空

可能有小伙伴不明白为什么又要设计这两个接口,因为这两个信息都可以直接通过队列的结构体获得,好像没什么作用啊。设计这两个接口并使用它们而不是直接通过结构体的内容来判断是因为,当我们的需求发生改变了,所创建的结构体可能也会跟着修改,可能提取的方式会发生一些改变   如果我们在使用队列的时候已经直接通过结构体的内容进行了多次的判断,那么我们要修改起来,要修改多次,很不方便,这样做的好处就是只用修改一次即可

队列元素个数

int size_queue(Que* q1)
{assert(q1);return q1->sz;
}

判空

int empty_queue(Que* q1)
{assert(q1);return q1->sz == 0;//相等即为空,返回1(真)//不相等即为非空,返回0(假)
}

 2.4取队头元素和队尾元素

这两个操作很相似,唯一要注意的就是,为空的时候不能取

取队头元素

QueDateType queue_front(Que* q1)
{assert(q1);assert(!empty_queue(q1));//队列不能是空return q1->head->data;
}

取队尾元素 


QueDateType queue_back(Que* q1)
{assert(q1);assert(!empty_queue(q1));//队列不能是空return q1->tail->data;
}

 2.5出队

需要注意的是,不能够删除空队列,其次我们删除到最后一个节点时要单独处理

void pop_queue(Que* q1)
{assert(q1);assert(!empty_queue(q1));if (q1->head->next == NULL)//最后一个节点单独处理//避免尾指针变野指针{free(q1->head);q1->head = NULL;q1->tail = NULL;}else{Quenode* next = q1->head->next;free(q1->head);q1->head = next;}q1->sz--;
}

 2.6摧毁队列

void destroy_queue(Que* q1)
{assert(q1);Quenode* cur = q1->head;while (cur){Quenode* next = cur->next;free(cur);cur = next;}
}

2.7测试接口

测试代码:

#include"queue.h"
void test1()
{Que q1;init_queue(&q1);push_queue(&q1, 1);push_queue(&q1, 2);push_queue(&q1, 3);push_queue(&q1, 4);push_queue(&q1, 5);printf("%d\n", queue_back(&q1));while (!empty_queue(&q1)){printf("%d ", queue_front(&q1));pop_queue(&q1);}destroy_queue(&q1);
}
int main()
{test1();
}

测试结果:

 三、所有代码

1.接口实现

#include"queue.h"
void init_queue(Que* q1)
{assert(q1);//q1存放的是结构体的指针,不应为空,为空操作不了q1->head = NULL;q1->tail = NULL;q1->sz = 0;
}
void push_queue(Que* q1, QueDateType x)
{assert(q1);//创建一个新节点,并初始化Quenode* newnode = (Quenode*)malloc(sizeof(Quenode));	if (newnode == NULL){perror("push_queue");exit(-1);}newnode->next = NULL;newnode->data = x;if (q1->head == NULL)//如果头为空,意味着还没有节点,单独处理{q1->head = q1->tail = newnode;}else{q1->tail->next = newnode;//原来的尾链接上新的尾q1->tail = newnode;//将尾更新}q1->sz++;
}
int size_queue(Que* q1)
{assert(q1);return q1->sz;
}
int empty_queue(Que* q1)
{assert(q1);return q1->sz == 0;//相等即为空,返回1(真)//不相等即为非空,返回0(假)
}
QueDateType queue_front(Que* q1)
{assert(q1);assert(!empty_queue(q1));//队列不能是空return q1->head->data;
}
QueDateType queue_back(Que* q1)
{assert(q1);assert(!empty_queue(q1));//队列不能是空return q1->tail->data;
}
void pop_queue(Que* q1)
{assert(q1);assert(!empty_queue(q1));if (q1->head->next == NULL)//最后一个节点单独处理//避免尾指针变野指针{free(q1->head);q1->head = NULL;q1->tail = NULL;}else{Quenode* next = q1->head->next;free(q1->head);q1->head = next;}q1->sz--;
}
void destroy_queue(Que* q1)
{assert(q1);Quenode* cur = q1->head;while (cur){Quenode* next = cur->next;free(cur);cur = next;}
}

2.队列的头文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int QueDateType;
//到时修改类型时只用改这里的一个就可以,不需要一个个修改
//同样,这也是为了和单一的int作区分
typedef struct QueueListNode
{struct QueueListnode* next;//存放下一个节点QueDateType data;//存放当前节点的数据
}Quenode;
typedef struct QueueInformation
{Quenode* head;//存放头节点Quenode* tail;//存放尾节点int sz;//存放个数
}Que;
void init_queue(Que* q1);
void push_queue(Que* q1, QueDateType x);
void pop_queue(Que* q1);
int size_queue(Que* q1);
int empty_queue(Que* q1);
QueDateType queue_front(Que* q1);
QueDateType queue_back(Que* q1);
void destroy_queue(Que* q1);

3.测试代码

#include"queue.h"
void test1()
{Que q1;init_queue(&q1);push_queue(&q1, 1);push_queue(&q1, 2);push_queue(&q1, 3);push_queue(&q1, 4);push_queue(&q1, 5);printf("%d\n", queue_back(&q1));while (!empty_queue(&q1)){printf("%d ", queue_front(&q1));pop_queue(&q1);}destroy_queue(&q1);
}
int main()
{test1();
}

好了,今天的分享到这里就结束了感谢各位友友的来访,祝各位友友前程似锦O(∩_∩)O

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

24届近5年东华大学自动化考研院校分析

今天给大家带来的是东华大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、东华大学 学校简介 东华大学&#xff08;Donghua University&#xff09;&#xff0c;地处上海市&#xff0c;是教育部直属全国重点大学&#xff0c;国家“双一流”、“211工程”建设高校…

无锚框原理 TOOD:Task-aligned One-stage Object Detection

无锚框原理 TOOD&#xff1a;Task-aligned One-stage Object Detection 一 摘要二 引言TOOD设计 三 具体设计Task-aligned Head任务对齐的预测器 TAP预测对齐 TAL 任务对齐学习Task-aligned Sample Assignment多任务损失 一 摘要 一阶段目标检测通常通过优化两个子任务来实现&…

爬虫017_urllib库_get请求的quote方法_urlencode方法_---python工作笔记036

按行来看get请求方式 比如这个地址 上面这个地址复制粘贴过来以后 可以看到周杰伦变成了一堆的Unicode编码了 所以这个时候我们看,我们说https这里,用了UA反爬,所以这里 我们构建一个自定义的Request对象,里面要包含Us

优秀项目团队最突出的5项重要特征

一个优秀的开发团队&#xff0c;对于软件项目而言&#xff0c;其重要性不言而喻。否则项目团队一盘散沙&#xff0c;直接影响项目准时保质保量地交付。一般从大家的认可度来说&#xff0c;优秀团队最突出的特征&#xff0c;主要集中在以下几个方面&#xff1a; 1、目标明确 优秀…

.netcore下grpc概述

一、什么是grpc 是一种与语言无关的高性能远程过程调用 (RPC) 框架。基于http/2标准设计&#xff0c;提供了头部压缩、tcp连接上的多路复用、流量控制、流式处理&#xff08;客户端流/服务端流/双向流&#xff09;。提供统一使用的.proto文件&#xff0c;它定义 grpc 服务和消…

allure测试报告

使用pytest结合Allure进行测试报告生成的简单教程 allure测试报告 Allure基于Java开发&#xff0c;因此我们需要提前安装Java 8或以上版本的环境。 ◆安装allure-pytest插件在DOS窗口输入命令“pip3 install allure-pytest”&#xff0c;然后按“Enter”键。 下载安装Allure…

HCIP STP(生成树)

目录 一、STP概述 二、生成树协议原理 三、802.1D生成树 四、STP的配置BPDU 1、配置BPDU的报文格式 2、配置BPDU的工作过程 3、TCN BPDU 4、TCN BPDU的工作过程 五、STP角色选举 1、根网桥选举 2、根端口选举 3、指定端口选举 4、非指定端口选举 六、STP的接口状…

【将回声引入信号中】在语音或音频文件中引入混响或简单回声,以研究回声延迟和回波幅度对生成的回波信号感知的影响(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

书写自动智慧:探索Python文本分类器的开发与应用:支持二分类、多分类、多标签分类、多层级分类和Kmeans聚类

书写自动智慧&#xff1a;探索Python文本分类器的开发与应用&#xff1a;支持二分类、多分类、多标签分类、多层级分类和Kmeans聚类 文本分类器&#xff0c;提供多种文本分类和聚类算法&#xff0c;支持句子和文档级的文本分类任务&#xff0c;支持二分类、多分类、多标签分类…

Cocos Creator的rigidBody.applyForce变成了滚动

序: 1、原因是因为没有调整摩擦系数physics-material 2、摩擦系数调整你要在你的节点 一个物理材料才会有的&#xff0c;教程没跳过去了所以没有 3、扩展阅读第一话&#xff1a;入行程序员的一波三折 最终效果&#xff1a; git录屏会卡&#xff0c;其实过程很平滑 正…

STL文件格式详解【3D】

STL&#xff08;StereoLithography&#xff1a;立体光刻&#xff09;文件是 3 维表面几何形状的三角形表示。 表面被逻辑地细分或分解为一系列小三角形&#xff08;面&#xff09;。 每个面由垂直方向和代表三角形顶点&#xff08;角&#xff09;的三个点来描述。 切片算法使用…

spring cloud alibaba 应用无法注册到sentinel dashboard

一。技术背景 由于升级jdk17的需要 我们将项目中的 spring cloud spring cloud alibaba 以及springboot进行了升级 各版本如下 spring cloud 2021.0.5 spring cloud alibaba 2021.0.5.0 spring boot 2.6.13 二。问题表现 当启动项目服务后&#xff0c;服务无法注册到 sentin…

UDP简介

UDP 1. UDP格式2. UDP特点3. 差错检验 1. UDP格式 16位UDP长度&#xff0c;表示整个数据报&#xff08;UDP首部UDP数据&#xff09;的最大长度&#xff1b; 如果校验和出错&#xff0c;就会直接丢弃; 2. UDP特点 无连接: 知道对端的IP和端口号就直接进行传输&#xff0c;不需…

C语言 指针变量的大小与指针类型

一、指针变量的大小 例如:int main() {int num 10;int* p &num;char ch w;char* pc &ch;printf("%d\n",sizeof(p));printf("%d\n",sizeof(pc));return 0; }答案分别是 4 和 4 指针变量中存储的是地址&#xff0c;而非前缀类型下的元素&…

Docker安装Grafana以及Grafana应用

Doker基础 安装 1、 卸载旧的版本 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 2、需要的安装包 sudo yum install -y yum-utils 3、设置镜像的仓库 yum-config-m…

2000-2022年全国各地级市绿色金融指数数据

2000-2022年全国各地级市绿色金融指数数据 1、时间&#xff1a;2000-2022年 2、来源&#xff1a;来源&#xff1a;统计局、科技部、中国人民银行等权威机构网站及各种权威统计年鉴&#xff0c;包括全国及各省市统计年鉴、环境状况公报及一些专业统计年鉴&#xff0c;如 《中国…

opencv基础53-图像轮廓06-判断像素点与轮廓的关系(轮廓内,轮廓上,轮廓外)cv2.pointPolygonTest()

点到轮廓的距离 在 OpenCV 中&#xff0c;函数 cv2.pointPolygonTest()被用来计算点到多边形&#xff08;轮廓&#xff09;的最短距离&#xff08;也 就是垂线距离&#xff09;&#xff0c;这个计算过程又称点和多边形的关系测试。该函数的语法格式为&#xff1a; retval cv2…

模板方法模式(Template Method)

模板方法模式是一种行为设计模式&#xff0c;在超类中定义了一个算法的框架&#xff0c;而将一些步骤的实现延迟到子类中&#xff0c;使得子类可重定义该算法的特定步骤。 Template Method is a behavior design pattern. It defines an algorithm framework in the superclas…

企业运单管理教程

随着电子面单的普及&#xff0c;以及商务寄件稳步增加&#xff0c;快递公司为了留住商企客户&#xff0c;推出了月结协议模式寄件。企业可以根据寄件量大小&#xff0c;和快递公司签订月结协议&#xff0c;运费每月结算一次&#xff0c;还能根据自身的寄件量&#xff0c;向快递…

[C语言]深入浅出,带你构建C语言宏观框架

导言&#xff1a; 本文章会带你基本了解C语言&#xff0c;对他有一个感性的认识&#xff0c;对其有一个框架&#xff0c;后期在对其进行更加细致的补充。 文章目录 C语言第一个函数变量局部变量 与 全局变量常量字符串 与 转义字符 头文件分支 与 循环注释数组关键字操作符宏指…