- 博客(25)
- 收藏
- 关注
原创 10_树二叉树深搜广搜概念及其实现
本文系统介绍了树和二叉树的基本概念、存储结构及遍历方法。首先阐述了树的递归定义和基本术语(根节点、叶子节点、度等),重点讲解了三种存储结构:双亲表示法、孩子表示法和孩子兄弟表示法。其次详细介绍了二叉树的特性,包括满二叉树和完全二叉树的定义。在存储方面,对比分析了顺序存储和链式存储的优缺点。最后深入探讨了二叉树的遍历算法,包括层次遍历和深度优先遍历(先序、中序、后序),并给出了具体实现思路。全文通过大量图示辅助理解,为学习树形数据结构提供了系统性的理论基础。
2025-09-21 14:32:15
1003
原创 12_stl(1)—string
本文介绍了C++ STL标准模板库中的string容器及其常用操作。STL包含容器、迭代器和算法三类组件,string作为常用容器提供了比C语言字符数组更安全的字符串处理方式。文章详细讲解了string的初始化、输入输出、比较、连接、字符访问等基本操作,以及substr、insert、erase、append、replace等实用函数,并通过代码示例展示了这些功能的具体应用。最后还演示了如何利用ispunct()函数去除字符串中的标点符号。
2025-09-21 14:12:53
763
原创 11_模板
C++模板编程摘要:模板是C++中实现代码重用的重要机制。函数模板通过template<typename T>定义,可自动推导参数类型生成不同版本函数。类模板允许定义基于通用类型的类成员,使用时需显式实例化(如Pair<int>)。模板支持隐式和显式实例化,可用typedef或using创建别名(如using t=Pair2<T>)。模板能减少重复代码,提高开发效率,但需注意类型推导的局限性。通过交换函数等案例展示了模板的实际应用价值。
2025-09-14 15:02:21
407
原创 10_异常处理
文章摘要 C++异常处理机制用于运行时错误管理,通过try/catch/throw关键字实现。try块包含可能出错的代码,catch捕获异常,throw抛出异常。异常继承自std::exception类,可自定义异常类。示例展示了除零异常处理及自定义异常的实现。此外还介绍了嵌套类(类中定义类)和局部类(函数中定义类)的概念,嵌套类可访问外围类成员,局部类仅限函数内使用。异常处理能控制错误范围,保证程序在出错后继续执行。
2025-09-14 14:55:24
805
原创 09_多态
摘要: C++多态分为编译时多态(如函数重载)和运行时多态(基于继承和虚函数)。运行时多态通过基类指针/引用调用虚函数实现,程序在运行时根据实际对象类型决定调用哪个函数版本。构成多态需满足:继承关系、同名虚函数覆盖、基类指针调用虚函数。虚析构函数能确保派生类对象被正确释放,先调用子类析构再调用父类析构。多态的核心思想是"晚绑定",使程序更灵活可扩展。
2025-09-06 14:25:53
1046
原创 08_继承和派生概念与继承方式
摘要 本文介绍了C++中的继承和派生概念,以及三种继承方式(public、protected、private)的区别。继承允许派生类复用基类的成员变量和函数,减少代码重复。public继承保持成员访问权限不变,protected继承将public成员降级为protected,private继承将基类非private成员变为private。文章通过动物类和狗类的实例演示了public继承的应用,并指出基类private成员始终不可被派生类直接访问。此外,还探讨了派生类中如何调用基类构造函数的问题,介绍了初始化
2025-09-06 13:55:54
1145
原创 菱形继承 虚继承
本文介绍了C++中的菱形继承问题及虚继承解决方案。菱形继承发生在多继承场景下,当派生类D继承自两个具有共同基类A的类B和C时,会导致数据冗余和访问冲突。通过虚继承(virtual public)可以确保派生类中只保留一份间接基类成员,解决数据冗余问题。文章还展示了虚继承构造函数的初始化特点:虚基类由最终派生类初始化,中间派生类的初始化会被覆盖。代码示例清晰地演示了菱形继承问题及其解决方案,帮助读者理解虚继承的概念和实际应用。
2025-07-18 18:55:45
510
原创 顺序队列和链式队列
文章摘要 本文介绍了队列的两种实现方式:顺序队列和链式队列。顺序队列采用数组存储,通过队头和队尾指针实现入队和出队操作,存在"假溢出"问题,可通过循环队列解决。链式队列采用链表结构,适合数据量不确定的场景,通过尾插法实现入队操作。文章详细讲解了两种队列的结构定义、基本操作实现(初始化、入队、出队)及代码示例,并分析了顺序队列判满判空的方法。两种队列各有优缺点,顺序队列空间利用率高但容量固定,链式队列灵活但需要额外空间存储指针。
2025-07-12 18:16:52
1099
原创 顺序栈和链式栈
栈结构及其实现方式 摘要:本文介绍了栈的基本概念、应用场景及两种实现方式。栈是一种遵循&先进后出;原则的线性结构,常见应用包括历史记录和机器人路径追踪等。文章详细阐述了顺序栈的实现方法,包括四种压栈/出栈组合(递增空栈、递增满栈、递减空栈、递减满栈),并提供了完整代码示例。此外,还探讨了链式栈的实现思路,通过链表节点操作来满足栈的特性要求。两种实现方式各有特点,顺序栈使用数组固定大小,而链式栈则通过动态内存管理实现灵活扩展。
2025-07-05 22:16:14
849
原创 双向循环链表及实现
本文介绍了双向循环链表的数据结构及其实现方法。双向链表相比单向链表的优势在于可以双向遍历。文章详细讲解了双向循环链表的节点结构、插入和删除操作的实现原理,并提供了完整的C语言代码实现。通过图示和代码示例,展示了如何从头/尾插入节点以及删除节点的具体操作步骤。最后给出了测试用例和运行结果,验证了双向循环链表的正确性。该实现采用带头节点的双向循环链表结构,封装了初始化、插入、删除等基本操作,为读者提供了实用的链表操作范例。
2025-06-27 21:24:02
523
原创 单项循环链表及带头指针的链表
链表与循环链表的实现 本文探讨了带头指针的单向链表和单项循环链表的实现方法。对于带头指针链表,通过引入临时dummy节点简化操作,使插入删除等操作更规范化。循环链表则分为带头指针和不带头指针两种形式,解决了首尾相连情况下的遍历问题。代码实现展示了链表初始化、插入删除等基本操作,以及循环链表的特殊处理方式。这些基础结构为后续学习树、图等非线性数据结构奠定基础。
2025-06-20 01:07:28
569
原创 单项链表的操作及其实现
很好我们已经明白了顺序表的实现了如果不明白请看我的数据结构专栏中顺序表的文章我们来简单的复习一下顺序表为啥连续的空间条件苛刻,我简单的来个比喻你就明白了,如果你想要再一条步行街上买上十间商铺,那如果这个步行街已经有一段时间了,,为什么?这还用说,肯定是其他的商铺主了,你无法将十间商铺连这买,但是你要是将十间商铺分开买就简单的多了。依次类推我们的内存也是这样一个道理,而在数据结构中我们将这种方法称之为。那么我们正式来开始我们的链表学习上面商铺的比喻很是形象的说明了这个特性也就是我们经常看见的图为啥。
2025-06-13 22:14:40
1215
原创 继承的调用顺序与多继承
摘要: 本文主要探讨了C++继承中的调用顺序和多继承特性。在继承中,构造函数的调用遵循从父类到子类的顺序,而析构函数则相反。多继承允许一个类继承多个父类,但需要注意构造函数的调用顺序由声明顺序决定而非初始化列表顺序。文章还指出多继承可能引发的命名冲突问题,当多个父类存在同名成员时,必须通过显式指定父类名称来消除歧义。通过多个代码示例,清晰展示了继承顺序、多继承语法以及命名冲突的解决方法。
2025-06-10 01:29:48
607
原创 顺序表的实现
顺序表的实现涉及两种存储方式:栈(固定大小,自动管理)和堆(动态扩容,需手动管理)。本文主要讨论基于堆的动态顺序表实现,通过表头结构(包含数据指针、当前位置和容量)管理内存空间。关键操作包括:创建/释放表头、扩容、查找、尾插/头插元素以及删除元素。代码示例展示了如何用C语言实现这些功能,重点在于正确处理内存分配和数据搬迁。顺序表适合需要随机访问但插入删除较少的场景,其动态扩容特性克服了静态数组的局限性。
2025-06-06 23:48:55
874
3
原创 数据结构概述及其线性结构(无代码)
数据结构是计算机存储和组织数据的方式,主要包括逻辑结构和存储结构。逻辑结构描述数据之间的关系,分为线性结构(1:1)、树形结构(1:n)和图结构(m:n)。存储结构实现逻辑结构在物理内存中的表示,主要有顺序存储(元素连续排列)和链式存储(通过指针连接离散元素)。顺序存储查找位置快但插入删除慢,链式存储插入删除方便但查找效率低。理解这两种结构的特性有助于选择合适的数据存储方式。
2025-06-03 22:51:25
919
原创 多文件编程
了解多文件编程的方法以及模块化设计的思想与运行原理在我们编译.c的时候,你是否想过从.c到可执行文件中间到底发生了什么。当你的程序中有多个.c,在运行时每个.c都会单独编译成.o文件,而多个.o文件相互链接就可以生成一个可执行文件。好的为了证明上述说的这个过程,我们来用系统cmd来看看首先我们先用记事本打出一个.c文件然后再cmd中用gcc编译器运行注意这里是警告,说明已经编译成功了,c语言对于没有定义的函数是会将它先进行编译,然后再进行链接报错,当然这里虽然编译成功了,但是无法运行,因为缺少原材料也就是
2025-06-02 17:10:17
736
原创 继承和派生概念与继承方式
继承和派生是面向对象编程的核心概念,允许新类复用现有类的属性和方法。基类(父类)提供通用功能,派生类(子类)继承这些功能并扩展特有属性。继承方式分为public(保持访问权限)、protected(降为保护权限)和private(降为私有权限),但基类私有成员始终不可直接访问。构造/析构函数不自动继承,需通过初始化列表或C++11的using声明调用基类构造函数。通过继承可有效减少代码重复,实现层次化设计。
2025-05-31 14:36:23
800
原创 前置知识 c语言语法概论与内存管理
本文探讨了C语言的核心特性及其内存管理机制。首先分析了C语言的灵活性源于其直接操作内存的能力,并通过数据类型阐述了内存分配的基本原理。文章详细讲解了整型变量的存储方式(原码、反码、补码)和指针运算规则,指出指针加减操作与数据类型大小相关。此外还介绍了结构体、共用体等自定义数据类型,以及数组和字符串的特性。最后讨论了内存分段管理模型(代码段、数据段等),并指出不当内存访问会引发程序崩溃。全文揭示了C语言"生万物"的本质在于其对内存的精细控制能力,同时也指出了这种灵活性带来的编程风险。
2025-05-27 22:22:35
1221
原创 运算符重载
C++运算符重载允许为自定义类重新定义运算符的行为。通过operator关键字可以重载大多数运算符,如=、+、>等,使其适用于特定类对象。运算符重载需遵循原有运算符的优先级和操作数个数,不能创建新运算符。常见应用包括对象赋值、数值运算、关系比较等。文中通过学生类和动物类的示例,展示了如何重载赋值、加法和比较运算符来实现自定义操作。运算符重载增强了代码可读性,使对象操作更直观自然。
2025-05-25 20:49:47
473
原创 动态创建对象数组,成员变量与成员函数
本文介绍了C++中动态创建对象数组、成员变量与成员函数的相关概念。首先,动态数组通过new关键字临时申请内存空间,使用后需通过delete[]释放。静态数组在程序开始时固定分配内存,而动态数组则根据需求在运行时分配。文章还详细讲解了栈聚合初始化和堆上创建对象数组的区别,强调在堆上创建对象数组时必须提供默认构造函数。此外,文章还介绍了成员变量和成员函数的使用,以及静态成员变量和静态成员函数的特点。静态成员变量在类的所有对象间共享,而静态成员函数只能访问静态成员变量,且可以通过类名或对象名调用。通过这些概念,读
2025-05-20 22:56:03
1146
原创 复制构造函数,析构函数
我们面对有些函数需要重复的去使用,那么我们就要去造一个一模一样的。举个栗子想象你有一个「玩具机器人」,现在想。复制构造函数就是那个「克隆机器」——只要把原版机器人放进去,就能造出完全一样的新机器人。当然复制也分好坏,克隆机器分为两种模式默认的克隆是(可能引发资源冲突)自己写的克隆是(完全独立的新资源)
2025-05-19 00:30:44
558
原创 面向对象,面向过程,类的定义
本文介绍了面向对象编程(OOP)与面向过程编程的区别,重点阐述了类和对象的概念。面向对象编程通过抽象对象及其交互来解决问题,核心特性包括封装、继承和多态;而面向过程编程则通过分解问题为一系列步骤来解决问题。类被比喻为设计图纸,定义了对象的属性和功能,而对象则是根据类创建的具体实例。文章还通过C++代码示例展示了如何定义类、创建对象以及使用构造函数。最后,文章强调了构造函数的重载和参数传递,帮助读者更好地理解面向对象编程的基本概念和实践。
2025-05-16 21:35:35
559
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅