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

C语言-栈、队列、二叉树

12 栈、队列、二叉树

目录

12 栈、队列、二叉树

一、栈、队列、二叉树是什么?

二、栈

1. 特点:先进后出 -- 有底的盒子

2. 使用场景:函数调用 -- 中断机制

3. 实现栈的形式:

三、队列

1. 特点:先进先出 -- 水管

2. 使用场景:消息队列(MQTT)

3. 实现队列的形式:

四、二叉树 -- 了解

1. 树形结构 -- 链式结构 -- 族谱

2. 使用场景:文件系统


一、栈、队列、二叉树是什么?

        -- 数据的一种存储结构         -- 保存数据

二、栈

1. 特点:先进后出         -- 有底的盒子

2. 使用场景:函数调用         -- 中断机制

3. 实现栈的形式:

(1)线性栈:数组

alt text

(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)线性队列:数组

alt text

(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. 使用场景:文件系统

alt text

icon-default.png?t=N7T8https://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

http://www.lryc.cn/news/419613.html

相关文章:

  • pinia-plugin-persistedstate 插件不生效
  • sqlite 合并两个数据库中的特定表
  • winform中设置DateTimePicker参数为空
  • Python爬虫(8)
  • 靓图!多点创新!CEEMDAN-Kmeans-VMD-CNN-LSTM-Attention双重分解+卷积长短期+注意力多元时间序列预测
  • zdpgo_gin_limit 为zdpgo_gin打造的接口限流框架,当API接口需要限制访问频率的时候可以使用此框架
  • Java1234的Vue学习笔记
  • 嵌入式八股-C++面试91题(20240809)
  • 如何恢复误删视频?找回误删视频文件的办法分享
  • 游戏手柄开发一款游戏
  • 【阿旭机器学习实战】【39】脑肿瘤数据分析与预测案例:数据分析、预处理、模型训练预测、评估
  • 深度学习基础 - 梯度垂直于等高线的切线
  • py2exe打包
  • Gerrit存在两个未审核提交且这两个提交有冲突时的解决方案
  • 基于单片机的智能风扇设计
  • 【实战】Spring Security Oauth2自定义授权模式接入手机验证
  • Redis数据失效监听
  • 【达梦数据库】-SQL调优思路
  • DispatcherServlet 源码分析
  • 代码随想录算法训练营第十八天| 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先
  • 会议室占用的时间(75%用例)D卷(JavaPythonC++Node.jsC语言)
  • C++初阶_1:namespace
  • 低代码开发平台:效率革命还是质量隐忧?
  • 在 Django 表单中传递自定义表单值到视图
  • Android之复制文本(TextView)剪贴板
  • Ubuntu24.04设置国内镜像软件源
  • 分布式与微服务详解
  • Vue设置滚动条自动保持到最底端
  • uniapp创建一个新项目并导入uview-plus框架
  • LabVIEW光电在线测振系统