数据结构与算法 ---- C/C++

2023-05-16

数据结构与算法 ----C/C++

学习数据结构的目的:针对不同的情况使用不同数据结构,去解决不同的问题

一、线性表

线性表一般有几个函数/(宏定义):

  • 初始化线性表 List_Init()/List_Create()
  • 返回第K元素的数据值 List_getElementData()
  • 返回线性表长度 List_getLength()
  • 插入一个元素到线性表 List_insertData()
  • 删除指定为序第i个元素 List_deleteData()

提示 : 在编写这些操作函数前(宏定义)首先要检验形参的合法性,如果是动态内存分配空间失败,应该退出,避免程序异常。

1、利用数组的连续存储空间顺序存放线性表的各个元素的优势如下:

  • 物理上存储空间连续、相对节省内存空间。
  • 访问速度快,用数组方式访问元素更加快,只需要知道索引即可。
  • 插入/或删除元素不方便,其他后面的元素也要向后移动,删除元素后,其他后面的元素也要向前移动。
  • 需要预先控制数组长度。

2、利用链表实现数据存储

  • 生成节点相对耗费时间,动态内存函数调用
  • 访问某一个位置数据需要遍历方式,相对较慢
  • 方便插入和删除数据、不需要移动数据的元素,只需要修改“链表节点”。
  • 容易出现内存碎片,这种情况单片机比较容易出现
  • 内存空间不连续,消耗更多一点(只是一点点而已)
  • 不需要预先控制长度,长度根据内存容量决定

链表种类

1、单链表

优势:动态内存分配比双向链表少一个指针,那么分配内存相对较少。
在这里插入图片描述

2、双向链表

优势:容易获取尾部最后一个节点,适用于FIFO类型的数据结构,FIFO的节点个数根据内存容量决定(应该限制一下,避免内存分配满了,导致程序没有可用内存而挂掉)。
在这里插入图片描述
链表实际应用场景:FreeRTOS系统上的任务、线程运行队列、连续上送数据。

二、堆栈

堆栈:可以用链式(Top是链表头)、数组等方式实现堆栈

1、数据出口和入口是同一个
2、数据入栈和出栈特点:先进后出(FILO)
3、需要两个指针分别指向栈顶和栈底的元素

在这里插入图片描述
一般有几个操作集/(宏定义)

  • 初始化空堆栈、并设置长度位stackMaxSize Stack_Init()/Stack_Create()
  • 判断堆栈S是否已经满了 Stack_isFull()
  • 将数据入栈 ,加入栈顶元素 Stack_pushData()
  • 将数据出栈 ,返回栈顶元素 Stack_popData()
  • 判断堆栈是否为空 Stack_isEmpty()

堆栈表达式求值中缀表达式 -->> 后缀表达式

2+9/3-5 -->> 2 9 3/ + 5 -

当表达式中出现有 ( ) 括号或者 [ ] 中括号时候
算法思路:
(1)初始化一个栈大小为Stack_maxSize
(2)若是出现右括号,则栈中元素不断出栈并进行运算,直至出栈元素为左括号
(3)若果是左括号的话,则压入栈中
(4)若是所有元素都出栈还是匹配不到(左、右)括号

应用场景:Android 软件界面的APP、微信界面、小程序、门禁人机交互界面、一些进入/返回界面操作能够体现出来

三、队列

队列:顺序存储(数组)/链式存储(链表),受约束的线性表

  • 插入与删除操作:加入元素只能在一端,删除元素只能在另一端
  • 先进先出(先来先服务)(FIFO)
  • 两个指针指向队列头(font)和尾部(rear)
    在这里插入图片描述
    操作集
    1、创建队列 Queue_Create()
    2、加入队列 Queue_addElement()
    3、删除队列 Queue_delElement()
    4、判断队列是否满了 Queue_isFull()
    5、判断队列是否为空 Queue_isEmty()

数据结构应用实例:Window消息机制、发送数据的缓冲区、事件发生消息机制、多半用于通信的消息机制。

四、查找

在某些数据类型中经常要经行查找的操作
查找:根据某个给定关键字K,从集合R中找出关键字与K相同的记录

静态查找:集合的记录固定不变

  • 没有插入与删除、只有查找
    动态查找:集合的记录动态变化
  • 除了查找、集合有插入和删除

顺序查找
1、查找出固定元素后退出
2、查找不出来,到了数组边界时候退出
3、建立一个//哨兵//,就是第一个元素赋值是自己要找的元素。

  • 如果返回值是第一个,没找到元素
  • 返回值不是第一个,找到元素并返回位置

二分查找
1、要求n个数据的集合,必须有序排列(有序比如:从小到大 )
查找范围:
3 22 243 244 255 266 455 677 744 844
1 2 3 4 5 6 7 8 9 10
取中间值,进行比较,当两个指针分别是左边的和右边的相反位置时候,找不到

五、树

1、结点的度(Degree):结点的子树个数
2、树的度:树的所有结点中最大的度数
3、叶结点:度为0的结点
4、父结点:
5、子结点:
6、兄弟结点:具有同一父结点的各结点彼此时兄弟结点
7、路径和长度:

二叉树

  • 树中所有结点的度不大于2的树
  • 一个二叉树第i层最大结点数有2的i-1次方,i≥1
  • 深度为K的二叉树有最大结点总数为:2的K次方 减1,K≥1

二叉树操作集
1、判断二叉树是否为空 Tree_IsEmpty()
2、遍历,按某顺序访问每个结点 Tree_goTraversal()
3、创建一个二叉树 Tree_goCreateBinTree()

特殊二叉树:斜二叉树、完全二叉树、完美二叉树、满二叉树

常用的遍历方法有
void PreOrderTraversal() 先序遍历 – 根、左子树、右子树
void InOrderTraversal() 中序遍历 – 左子树、根、右子树
void PostOrderTraversal() 后序遍历 – 左子树、右子树、根
void LevelOrderTraversal() 层次遍 历 – 从上到下、从左到右

二叉树的存储结构
1、顺序存储结构(数组)

利用数组存储完全二叉树(仅限于完全二叉树,可以补齐成一个完全二叉树)

  • 非根结点的父节点的序号是[ i / 2 ]
  • 结点的左孩子结点的序号是[ 2i ]
  • 结点的右孩子结点的序号是[ 2i + 1 ]

2、链表存储

更新未完…

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

数据结构与算法 ---- C/C++ 的相关文章

  • 《Linux From Scratch》第三部分:构建LFS系统 第六章:安装基本的系统软件- 6.29. Coreutils-8.23...

    Coreutils 软件包包含用于显示和设置基本系统特性的工具 大概编译时间 2 5 SBU 需要磁盘空间 193 MB 6 29 1 安装 Coreutils POSIX 要求 Coreutils 中的程序即使在多字节语言环境也能正确识别
  • 算法--将数组分成和相等的多个子数组,求子数组的最大个数

    作者 陈太汉 一个整数数组 长度为n 将其分为m份 使各份的和相等 求m的最大值 比如 3 2 4 3 6 可以分成 3 2 4 3 6 m 1 3 6 2 4 3 m 2 3 3 2 4 6 m 3 所以m的最大值为3 算法 原理的思想是
  • LeetCode83: 删除排序链表中的重复元素

    给定一个已排序的链表的头 head 删除所有重复的元素 使每个元素只出现一次 返回 已排序的链表 示例 1 输入 head 1 1 2 输出 1 2 示例 2 输入 head 1 1 2 3 3 输出 1 2 3 提示 链表中节点数目在范围
  • 一文弄懂循环链表、双向链表、静态链表

    循环链表 双向链表 静态链表 三遍定律 理解了单链表本文的理解易如反掌 单链表请点击这里 理解了单链表本文的理解易如反掌 单链表请点击这里 理解了单链表本文的理解易如反掌 单链表请点击这里 1 循环链表 将单链表中终端结点的指针端由空指针改
  • Qt——用于表格QTableView的模型

    如果想使用表格来呈现数据 Qt提供了一个方便的部件QTableWidget 但是直接用它实现一些功能可能比较困难 这里将介绍一种强大 灵活的方式来操作表格 一 模型 视图架构 在这个架构中 模型用于存储数据 视图用于呈现数据 除此之外 还有
  • Hash table and application in java

    查找的效率取决于在查找是比较的次数 次数越少效率越高 反之越低 最理想的情况是无需比较 一次存取便能找到所查找的记录 根据对应关系f找到给定值K的像f K hash function 应运而生 由此思想建的表称为hash table 集合h
  • findBug 错误修改指南

    FindBugs错误修改指南 1 EC UNRELATED TYPES Bug Call to equals comparing different types Pattern id EC UNRELATED TYPES type EC c
  • 常用的十种算法--马踏棋盘算法

    1 马踏棋盘算法介绍 马踏棋盘算法也被称为骑士周游问题 将马随机放在国际象棋的 8 8 棋盘 Board 0 7 0 7 的某个方格中 马按走棋规则 马走日字 进行移动 要求每个方格只进入一次 走遍棋盘上全部 64 个方格 2 马踏棋盘算法
  • 递归算法中的时间复杂度分析

    对于一种算法的时间复杂度分析还是特别重要的 在一些非递归算法中 我们仅仅看运算次数最多的那一行代码可能执行多少次就可以 实际就是看在循环中变量的变化 但是对于递归算法中该怎么分析呢 下面介绍几种递归函数中的算法时间复杂度分析的方法 0 递推
  • 链表面试题(一):反转链表的算法实现

    关于链表的考察 链表是面试里面经常涉及到的考点 因为链表的结构相比于Hashmap Hashtable Concurrenthashmap或者图等数据结构简单许多 对于后者更多面试的侧重点在于其底层实现 比如Hashmap中Entry
  • 堆栈01--用两个栈实现队列

    堆栈01 用两个栈实现队列 jz05 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 用两个栈来实现一个队列 完成队列的Push和Pop操作 队列中的元素为int类型 测试用例 队列先进先出 输入 1 2 输出 1 2 解析
  • 如何防止过拟合和欠拟合

    过拟合和欠拟合是模型训练过程中经常出现的问题 两种情况正好相反 现将两者的定义及如何防止进行简要总结 1 过拟合 1 1 定义 是指模型对于训练数据拟合呈现过当的情况 反映到评估指标上就是模型在训练集上的表现很好 但是在测试集上的表现较差
  • 浮生六记

    浮生六记 目录 浮生六记卷一 闺房记乐 002 浮生六记卷二 闲情记趣 015 浮生六记卷三 坎坷记愁 022 浮生六记卷四 浪游记快 034 浮生六记 2 浮生六记卷一 闺房记乐 余生乾隆癸未冬十一月二十有二日 正值太平盛世 且在 衣冠之
  • 人工智能概念

    人工智能概念 人工智能就是用人工方法在机器 计算机 上实现的智能 或称机器智能 即是研究如何用计算机来表示和执行人类的智能活动 以模拟人脑所从事的推理 学习 思考和规划等思维活动 并解决需要人类的智力才能处理的复杂问题 如医疗诊断 管理决策
  • 用指针访问一维数组

    文章目录 顺序查找 数组方式实现 指针实现方式 对一位数组元素的访问有三种方式 指针变量的关系运算 引例 数组实现方式 主函数 指针实现方式 主函数 一维数组作为函数的参数 实际应用 顺序查找 要求用指针实现 在整数集合r中顺序查找与给定值
  • Leetcode1094. 拼车

    Every day a Leetcode 题目来源 1094 拼车 解法1 差分数组 对于本题 设 a i 表示车行驶到位置 i 时车上的人数 我们需要判断是否所有 a i 都不超过 capacity trips i 相当于把 a 中下标从
  • 【数据结构】单链表的定义和操作

    目录 1 单链表的定义 2 单链表的创建和初始化 3 单链表的插入节点操作 4 单链表的删除节点操作 5 单链表的查找节点操作 6 单链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • 按照层次遍历结果打印完全二叉树

    按照层次遍历结果打印完全二叉树 按照推论结果 l 层首个节点位置 2 h l 1 l 层节点间距 2 h l 1 1 编码实现 public static
  • 从源码角度来谈谈 HashMap

    HashMap的知识点可以说在面试中经常被问到 是Java中比较常见的一种数据结构 所以这一篇就通过源码来深入理解下HashMap 1 HashMap的底层是如何实现的 基于JDK8 1 1 HashMap的类结构和成员 HashMap继承
  • 最大流-Dinic算法,原理详解,四大优化,详细代码

    文章目录 零 前言 一 概念回顾 可略过 1 1流网络 1 2流 1 3最大流 1 4残留网络 1 5增广路

随机推荐

  • 52单片机设计时钟(串口控制)

    实现目标 单片机时钟正常工作 xff0c 数码管显示时分秒 电脑和单片机串行通信 xff0c 通过电脑串口助手 xff0c 任意修改设置单片机的时钟值 实现的流程框图 运用到的原理有 定时器 计数器 定时器 计数器由高8位和低8位两个寄存器
  • 照片修复-使用Bringing-Old-Photos-Back-to-Life

    项目地址 github项目地址 xff1a https github com microsoft Bringing Old Photos Back to Life 环境搭建 1 下载Bringing Old Photos Back to L
  • cephadm部署分布式ceph存储

    文章目录 一 集群规划系统优化添加yum源挂载本地yum源添加ceph网络yum源添加kernel网络yum源添加docker网络yum源 升级内核部署docker部署时间同步安装ceph引导一个新集群RBD块存储osd 操作打标签监控器调
  • OCR入门教程系列(二):OCR技术发展

    作者简介 CSDN 阿里云人工智能领域博客专家 新星计划计算机视觉导师 百度飞桨PPDE 专注大数据与AI知识分享 公众号 GoAI的学习小屋 免费分享书籍 简历 导图等 更有交流群分享宝藏资料 关注公众号回复 加群 或 链接 加群 专栏推
  • 利用CSS浮动制作一个简易导航栏

    初学CSS 利用CSS浮动和无序列表制作一个简易导航栏 xff1a lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8
  • ERROR Error: Cannot find module ‘vue-loader-v16/package.json‘ vue3.0安装时的错误

    vue3 0 出来一段时间了 xff0c 一直没机会学 xff0c 现在按照网上的教程安装时居然有报错 xff01 我的解决是 直接把项目里面的node modules和package lock json文件删除了 xff0c 然后在重新执
  • php 树形菜单数据获取

    php 树形菜单数据获取 public function generateTree data condition 61 array if empty condition foreach data as k 61 gt v if in arr
  • go语言编译前端静态文件到可执行文件 -statik

    statik 安装 go get github com rakyll statik statik 使用 1 把安装好的包 里面的 statik go 文件编译好 然后运行 2 编译好的statik go文件 src 61 你的静态文件路径
  • goLand全局修改时区

    两种方法 第一种 xff1a loc 61 time FixedZone 34 UTC 34 8 3600 time Local 61 loc 第二种 loc err 61 time LoadLocation 34 America Atka
  • python之Pyperclip模块

    python之Pyperclip模块 下面介绍一下 xff0c python中的Pyperclip模块 xff0c 它的简单又实用 xff0c 主要用法就2点 xff1a 1 用于复制剪贴板里的内容 2 向剪贴板写入内容 一 Pypercl
  • 利用栈判断一个字符串是否是回文

    利用栈判断一个字符串是否是回文 问题描述 编写一个程序 xff0c 判断一个字符串是否为回文 xff08 顺读和倒读都一样的字符串称为回文 xff09 输入形式 长度小于100的任意字符串 输出形式 如果输入字符串是回文 xff0c 则输出
  • Java把String转换成Date类型(Date转换成String类型)

    1 String转换成Date类型 span class token class name SimpleDateFormat span ft span class token operator 61 span span class toke
  • 微信小程序开发自学笔记 —— 七、性能优化

    性能优化 启动 在小程序启动时 xff0c 微信会为小程序展示一个固定的启动界面 xff0c 界面内包含小程序的图标 名称和加载提示图标 此时 xff0c 微信会在背后完成几项工作 xff1a 下载小程序代码包 加载小程序代码包 初始化小程
  • Error: failed to unmarshal json. invalid character “*”looking for beginning of value解决方案

    IPFS config时出现 Error failed to unmarshal json invalid character looking for beginning of value 在Win10 命令行执行ipfs config命令
  • Jsp的四种作用域范围

    首先要声明一点 xff0c 所谓 34 作用域 34 就是 34 信息共享的范围 34 xff0c 也就是说一个信息能够在多大的范围内有效 JSP的四种范围 xff0c 分别为page request session application
  • go 调用shell命令 两种方式(有无返回值)

    阻塞方式 需要执行结果 适用于执行普通非阻塞shell命令 xff0c 且需要shell标准输出的需要对shell标准输出的逐行实时进行处理的 非阻塞方式 不需要执行结果 官网的标准中文库 阻塞方式 需要执行结果 主要用于执行shell命令
  • linux内核链表应用--笔记

    Windows 应用linux内核链表 一 从网上现在linux kernel代码 linux内核版本有2种 稳定版 次版本为偶数 xff0c 开发版 次版本为奇数 版本号 主版本 次版本 释出版本 修改版本 内核下载连接网站 xff1a
  • STM32单片机产生PWM信号

    STM32单片机产生PWM信号 1 开发环境 目标单片机 STM32F407VET6芯片 xff0c 系统时钟高达168Mhz 开发平台 xff1a KEIL 5 编写程序借助ST公司的标准函数库 xff0c 不过现在已经不更新这个写函数库
  • 应用linux内核链表

    一 STM32应用linux内核链表 在此之前 xff0c 已经对Linux内核链表已经移植过一次 不过是针对Windows平台 xff0c 下面是链接 xff1a https blog csdn net qq 36883460 artic
  • 数据结构与算法 ---- C/C++

    数据结构与算法 C C 43 43 学习数据结构的目的 xff1a 针对不同的情况使用不同数据结构 xff0c 去解决不同的问题 一 线性表 线性表一般有几个函数 xff08 宏定义 xff09 xff1a 初始化线性表 List Init