C语言-栈、队列、二叉树
12 栈、队列、二叉树
目录
12 栈、队列、二叉树
一、栈、队列、二叉树是什么?
二、栈
1. 特点:先进后出 -- 有底的盒子
2. 使用场景:函数调用 -- 中断机制
3. 实现栈的形式:
三、队列
1. 特点:先进先出 -- 水管
2. 使用场景:消息队列(MQTT)
3. 实现队列的形式:
四、二叉树 -- 了解
1. 树形结构 -- 链式结构 -- 族谱
2. 使用场景:文件系统
一、栈、队列、二叉树是什么?
-- 数据的一种存储结构 -- 保存数据
二、栈
1. 特点:先进后出 -- 有底的盒子
2. 使用场景:函数调用 -- 中断机制
3. 实现栈的形式:
(1)线性栈:数组

(2)链式栈:
-- 链表的头插法 --因为链表是从头开始遍历的。
#include "stdio.h"
#include "string.h"
#include "stdlib.h"struct stack
{int data[5]; //栈存储空间int *ptemp; //栈指针int *pstart; //栈底int *pend; //栈顶};struct stack * init_stack();
void push_stack(struct stack *p);
void pup_stack(struct stack *p);int main(int argc, char const *argv[])
{struct stack *p = init_stack();while (1){printf("*******栈操作********\n");printf("1.入栈 2.出栈 3.退出\n");printf("**********************\n");printf("请选择:");int n = 0;scanf("%d", &n);switch (n){case 1:printf("--->入栈\n");push_stack(p);break;case 2:printf("--->出栈\n");pup_stack(p);break;case 3:printf("--->退出\n");return 0;default:printf("输入错误,请重新输入!\n");break;}}return 0;
}struct stack * init_stack() //初始化栈
{//开辟栈空间struct stack *p = (struct stack *)malloc(sizeof(struct stack));//初始化//栈的存储空间memset(p->data,0,sizeof(p->data));//栈底p->pstart = p->data; //数组的首地址//栈顶p->pend = p->data + sizeof(p->data) / sizeof(p->data[0])-1;//首地址+偏移量(长度-1)//栈指针p->ptemp = p->pstart;return p;
}void push_stack(struct stack *p)
{//判断是否栈满if(p->ptemp == p->pend+1) //因为栈指针指向下一个可以存储的空间{printf("栈已满,请联系管理员!\n");return;}printf("请输入您要保存的数据:");scanf("%d",p->ptemp); //数据保存在栈指针指向的位置//栈指针指向下一个可以存储数据的空间p->ptemp++;printf("入栈成功!\n");
}void pup_stack(struct stack *p)
{//判断是否栈空if(p->ptemp == p->pstart){printf("栈空,请先入栈数据!\n");return;}//栈指针回到有数据的空间p->ptemp --;int num = *p->ptemp;printf("您出栈的数据是:%d\n",num);}
三、队列
1. 特点:先进先出 -- 水管
2. 使用场景:消息队列(MQTT)
3. 实现队列的形式:
(1)线性队列:数组

(2)链式队列:
-- 链表的尾插法
#include "stdio.h"
#include "stdlib.h"
#include "string.h"struct queue
{int data[5]; // 队存储空间int *pstart; // 队底int *pend; // 队顶int *pin; // 入队指针int *pout; // 出队指针int count; // 计数器 因为入队和出队是循环的,无法判断栈满,栈空int total; //入队总数
};struct queue * init_queue();
void push_queue(struct queue *p);
void pup_queue(struct queue *p);int main(int argc, char const *argv[])
{struct queue *p=init_queue();while (1){printf("*******队操作********\n");printf("1.入队 2.出队 3.退出\n");printf("**********************\n");printf("请选择:");int n = 0;scanf("%d", &n);switch (n){case 1:printf("--->入队\n");push_queue(p);break;case 2:printf("--->出队\n");pup_queue(p);break;case 3:printf("--->退出\n");return 0;default:printf("输入错误,请重新输入!\n");return 0;}}return 0;
}struct queue * init_queue()
{//开辟队空间struct queue *p = (struct queue *)malloc(sizeof(struct queue));//初始化//队的存储空间memset(p->data,0,sizeof(p->data));//队底p->pstart = p->data;//队顶p->pend = p->data + sizeof(p->data) / sizeof(p->data[0])-1;//入队指针p->pin = p->pstart;//出队指针 p->pout = p->pstart;//计数器p->count = 0;//入队总数p->total = sizeof(p->data) / sizeof(p->data[0]);return p;
}void push_queue(struct queue *p)
{//判断是否队满if(p->count == p->total){printf("队已满,请联系管理员!\n");return;}printf("请输入您要保存的数据:");scanf("%d",p->pin);//队指针指向下一个可以存储数据的空间p->pin++;//计数器累加p->count ++;//循环入队if(p->pin == p->pend+1) //开始循环{p->pin = p->pstart;}printf("入队成功!\n");
}void pup_queue(struct queue *p)
{//判断是都队空if(p->count == 0){printf("队空,请先入队数据!\n");return;}//出队int num = *p->pout;//出队指针指向下一个可以出队的空间p->pout ++;//计数器累减p->count--;//循环出队if(p->pout == p->pend+1){p->pout = p->pstart;}printf("您出队的数据是:%d\n",num);
}
四、二叉树 -- 了解
1. 树形结构 -- 链式结构 -- 族谱
2. 使用场景:文件系统

树
https://blog.csdn.net/m0_71813740/article/details/141090117?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22141090117%22%2C%22source%22%3A%22m0_71813740%22%7D
相关文章:
C语言-栈、队列、二叉树
12 栈、队列、二叉树 目录 12 栈、队列、二叉树 一、栈、队列、二叉树是什么? 二、栈 1. 特点:先进后出 -- 有底的盒子 2. 使用场景:函数调用 -- 中断机制 3. 实现栈的形式: 三、队列 1. 特点:先进先出 -- 水…...
pinia-plugin-persistedstate 插件不生效
引入使用该插件使用时发现不生效 原因:pinia实例调用顺序不当 将: // import ./assets/main.css import { createApp } from vue import { createPinia } from pinia import piniaPluginPersistedstate from pinia-plugin-persistedstate import App fr…...
sqlite 合并两个数据库中的特定表
sqlite 合并两个数据库中的特定表 命令行python 版本 命令行 .open v1/mydb.db attach v2/mydb.db as db2; insert into main.表1 select * from db2.表1; insert into main.表2 select * from db2.表2; .exit参数说明v1/mydb.db主db文件路径,合并后的结果就是它…...
winform中设置DateTimePicker参数为空
在C#中,使用DateTimePicker控件时,您可以将其Value属性设置为null或者DateTime.MinValue来表示没有选定的日期或时间。以下是如何设置默认值为空的示例代码: dateTimePicker1.Value DateTime.MinValue; 或者,如果您希望用户不能…...
Python爬虫(8)
JsonPath介绍使用 JsonPath是一种轻量级的查询库,可以从JSON文本数据中进行筛选和提取操作。有点类似于使用XPath在HTML数据中提取数据的功能。JsonPath 也可以通过使用类似于 XPath 的表达式来访问 JSON对象中的属性和元素,并支持通配符、筛选器和函数…...
靓图!多点创新!CEEMDAN-Kmeans-VMD-CNN-LSTM-Attention双重分解+卷积长短期+注意力多元时间序列预测
靓图!多点创新!CEEMDAN-Kmeans-VMD-CNN-LSTM-Attention双重分解卷积长短期注意力多元时间序列预测 目录 靓图!多点创新!CEEMDAN-Kmeans-VMD-CNN-LSTM-Attention双重分解卷积长短期注意力多元时间序列预测效果一览基本介绍程序设计…...
zdpgo_gin_limit 为zdpgo_gin打造的接口限流框架,当API接口需要限制访问频率的时候可以使用此框架
zdpgo_gin_limit 为zdpgo_gin打造的接口限流框架,当API接口需要限制访问频率的时候可以使用此框架 安装 go get github.com/zhangdapeng520/zdpgo_gin_limit使用教程 基于内存的限流 package mainimport (gin "github.com/zhangdapeng520/zdpgo_gin"…...
Java1234的Vue学习笔记
第一节 vue.js简介 简介 第二节 vue开发工具 vscode 第三节:vue HelloWorld实现 理解vue双向绑定v-model的概念 底层数据改变视图对应显示会变,视图绑定数据变会影响底层数据,对应MVVM模式http://blog.java1234.com/blog/articles/510.html <!DOCTYPE html> <…...
嵌入式八股-C++面试91题(20240809)
1. 讲一讲封装、继承、多态是什么? 封装:将具体实现过程和数据封装成一个类,只能通过接口进行访问,降低耦合性,使类成为一个具有内部数据的自我隐藏能力、功能独立的软件模块。 意义:保护代码防止被破坏&…...
如何恢复误删视频?找回误删视频文件的办法分享
在数字化时代,视频已成为我们生活中不可或缺的一部分,记录着珍贵的回忆、工作资料或是学习素材。然而,在电脑上一不小心误删视频文件,该怎么办?视频误删怎么恢复?有什么小技巧可以找回删除的视频࿱…...
游戏手柄开发一款游戏
使用游戏手柄开发一款游戏是一个既有趣又充满挑战的项目。这通常涉及多个步骤,包括选择合适的硬件、学习编程技能、设计游戏逻辑以及测试和优化游戏。以下是一个大致的步骤指南,帮助你开始这个过程: 1. 确定游戏类型和概念 游戏类型&#x…...
【阿旭机器学习实战】【39】脑肿瘤数据分析与预测案例:数据分析、预处理、模型训练预测、评估
《------往期经典推荐------》 一、【100个深度学习实战项目】【链接】,持续更新~~ 二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~ 三、深度学习【Pytorch】专栏【链接】 四、【Stable Diffusion绘画系列】专…...
深度学习基础 - 梯度垂直于等高线的切线
深度学习基础 - 梯度垂直于等高线的切线 flyfish 梯度 给定一个标量函数 f ( x , y ) f(x, y) f(x,y),它的梯度(gradient)是一个向量,表示为 ∇ f ( x , y ) \nabla f(x, y) ∇f(x,y),定义为: ∇ f ( x…...
py2exe打包
要用到py2exe打包python程序,记录一下。 写一个setup.py文件,内容如下: from distutils.core import setup import py2exeoptions {"py2exe":{"compressed": 1, # 0或1 1压缩,0不压缩"optimize&quo…...
Gerrit存在两个未审核提交且这两个提交有冲突时的解决方案
Gerrit存在两个未审核提交且这两个提交有冲突时的解决方案 问题背景 用户A提交了一个记录,用户A的记录未审核此时用户B又提交了,这个时候管理员去合并代码,合了其中一个后再去合另一个发现合并不了,提示冲突,这个时候另…...
基于单片机的智能风扇设计
摘 要: 传统风扇无法根据周围环境的温度变化进行风速的调整,必须人为地干预才能达到需求 。 本文基于单片机的智能风扇主要解决以往风扇存在的问题,其有两种工作模式: 手动操作模式和自动运行模式,人们可以根据需要进行模式选择。 在自动运行…...
【实战】Spring Security Oauth2自定义授权模式接入手机验证
文章目录 前言技术积累Oauth2简介Oauth2的四种模式授权码模式简化模式密码模式客户端模式自定义模式 实战演示1、mavan依赖引入2、自定义手机用户3、自定义手机用户信息获取服务4、自定义认证令牌5、自定义授权模式6、自定义实际认证提供者7、认证服务配置8、Oauth2配置9、资源…...
Redis数据失效监听
一、配置Redis开启 打开conf/redis.conf 文件,添加参数:notify-keyspace-events Ex 二、验证配置 步骤一:进入redis客户端:redis-cli步骤二:执行 CONFIG GET notify-keyspace-events ,如果有返回值证明配…...
【达梦数据库】-SQL调优思路
【达梦数据库】-SQL调优思路 --查看统计信息是否准确 select table_name,num_rows,blocks,last_analyzed from user_tables where table_name表名; #默认每周六1点进行全库信息统计1、确认SQL --sql select * from test;2、查看ET ---------------------------------------…...
DispatcherServlet 源码分析
一.DispatcherServlet 源码分析 本文仅了解源码内容即可。 1.观察我们的服务启动⽇志: 当Tomcat启动之后, 有⼀个核⼼的类DispatcherServlet, 它来控制程序的执⾏顺序.所有请求都会先进到DispatcherServlet,执⾏doDispatch 调度⽅法. 如果有拦截器, 会先执⾏拦截器…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
