C++
文章平均质量分 83
zhangyi_zy
这个作者很懒,什么都没留下…
展开
-
【C++】继承(菱形继承)
面向对象编程一.继承在面向对象编程中,继承是当对象或类基于另一个对象(原型继承)或类(基于类的继承)时,使用相同的实现(从对象或类继承)或指定新的实现来维护相同的行为。这样的继承类被称为其父类或超类的子类。它是代码重用的一种机制,允许通过公共类和接口独立扩展原始软件。继承是类型之间的关系建模,共享公有的东西,实现各自的本质。1.继承的三种关系(1)公有继承(public):原创 2017-04-03 23:01:52 · 601 阅读 · 0 评论 -
链表翻转(每K个结点进行一次逆置)
链表翻转给出一个链表和一个数k,比如链表1→2→3→4→5→6若k=2,翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现Node* RotateList(Node* list, size_t k). 我的思路是把每K个结点的逆置成的链表都当成一条新的链表,所以共有m=size/k条,然后再用上一条链表的原创 2017-07-24 13:01:01 · 1891 阅读 · 0 评论 -
判断一棵树是否为平衡树及求树的高度
什么是平衡树?所谓平衡树,就是树的任意结点的左子树和右子树的高度之差的绝对值不超过1。所以判断一棵树是否为二叉树,不难想到可以先求出树的高度,再求出左右子树的高度差来判断,那么就想先求树的高度。求树的高度可以用递归方法,树的高度其实是返回左右子树中高度较高的那一个,求当前的高度则还要再加1。1.求树的高度size_t _Depth(Node* root){ if (root =原创 2017-07-24 17:41:35 · 3583 阅读 · 1 评论 -
迷宫问题求解
如图,用1表示墙,用0表示通路,entry表示入口,exit表示出口,那么如何找到一条通路,用栈和递归方法都可以实现。一.用栈求解1.首先给定一个入口点,从入口点开始找。2.将入口点压栈,以后遇到的每一个合法位置的数据也要压栈,并且标记出来,表示走过的路径。3.判断哪些点能走通,也就是哪些点可以压栈,分别对当前位置的四个方向进行探测即可。找到能走的方向,循环上述过程原创 2017-07-25 17:37:32 · 499 阅读 · 0 评论 -
迷宫最短路径求解
上节中只是提到了如何找到迷宫的通路,但是很显然有些迷宫不止一条通路,所以怎样才能求得迷宫最短路径呢?要找到最短路径,那必然需要知道所有的路径,才能找出最短路径。所以最重要的还是利用栈和回溯法,同时和递归结合起来。思路:首先从入口点开始,查找下一个结点的时候要与当前结点进行比较,因为所有路过的结点都是被标记的,表示的是从入口点到当前点所走的长度,而且都是递增。所以有可能被比较的对原创 2017-07-25 18:41:59 · 2227 阅读 · 0 评论 -
C++实现线程安全单例类
1.什么是单例模式单例模式是一种非常常用的设计模式,几乎在稍大的工程项目中都会用到。单例类保证在全局中只有唯一一个类的实例对象,并且在类的内部提供了获取这个唯一实例的接口。在类中,实例化出一个对象需要调用构造函数,为了防止在类的外部调用构造函数构造出实例,对类的构造函数就应有所限制,可以将构造函数的访问权限设置为private或protected。还要提供一个访问实例的接口,在类中定义一个stati原创 2017-08-03 17:11:09 · 1846 阅读 · 0 评论 -
求差集:已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集
已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。思路:首先明白差集的定义:所有属于A但不属于B的元素就是A的差集。所以这道题就是要找到A和B相同的元素并在A集合中删除即可。原创 2017-07-26 18:54:09 · 693 阅读 · 0 评论 -
插入排序、选择排序、交换排序和归并排序
常见的比较算法有:排序算法的稳定性:假定在待排序的序列中,存在多个相同的关键字,若经过排序,这些关键字的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。一、插入排序1.直接插入排序思想:直接插入排序是在已有有序序列的基础上,在最末尾插入一个数,依次起从最大的数开始比较,如果大原创 2017-07-11 11:10:45 · 1747 阅读 · 0 评论 -
判断一颗二叉树是是否是另一颗树的子树
例如treeB是treeA的子树,那么如何判断B是A的子树呢?要做这道题,可以将过程分为两步:第一步,找到两棵树根节点有相同的值,只有根节点的值相同才有往下判断的必要;第二步,找到相同根节点之后,再判断根节点的子树是否包含B树一样的结构。注意:空树不是任何树的子树详细分析第一步:首先要找与B树根节点值相同的结点,那么就从A树的根节点2开始遍历,如果A树根结点的值与B树相同,原创 2017-07-27 16:54:10 · 586 阅读 · 0 评论 -
二叉树经典面试题4~判断一棵树是否是完全二叉树
二叉树经典面试题4~判断一棵树是否是完全二叉树分类: 剑指offer刷题(12) 作者同类文章X版权声明:本文为博主原创文章,未经博主允许不得转载。 一.问题描述 有一棵树判断该树是否是完全二叉树?二.问题分析1.完全二叉树的定义? 判断一棵树是否是完全二叉树,首先要知道什仫是完全二转载 2017-07-27 19:03:51 · 1226 阅读 · 0 评论 -
重建二叉树
题目:由前序遍历和中序遍历重建二叉树前序序列:1 2 3 4 5 6 中序序列:3 2 4 1 6 5思路:每次以前序遍历序列的第一个数作为根结点,再在中序遍历序列里边找到根结点。根据中序遍历的特点我们可以知道,只有左子树全部访问完之后才会访问根结点,所以我们找到根结点之后,发现根结点之前的数都是根结点的左子树的所有结点,右边的数都是根结点右子树的所有结点。那么,可以以根结点为原创 2017-07-28 16:31:44 · 304 阅读 · 0 评论 -
类型萃取
POD类型萃取POD: plain old data 平凡类型(⽆关痛痒的类型)--基本类型C++可以通过typeid获取到⼀个类型的名称,但是不能拿来做变量的声明。所以我们可以通过类型萃取对内置类型和非内置类型进行区分,其原理就是将内置类型全特化,这样我们在进行拷贝的时候就可以对内置类型和非内置类型进行不同的处理来提高效率。像sting这种深浅拷贝的问题也可以解决。主要应用:Se原创 2017-07-23 17:45:54 · 319 阅读 · 0 评论 -
求数组中次数超过一半的数字
一个数组中有一个数字的次数超过了数组的一半,求出这个数字。如:int a[]={2,3,2,2,2,2,2,5,4,1,2,3},求出超过一半的数字是2。这个问题有两种解法,第一种是依靠数组的特点来找出这个数,第二种是利用排序的思想来找,下面依次介绍这两种方法。1.利用数组本身的特性题目给出这个数出现的次数超过了数组元素个数的一半,假设数组为a[n],如果用计数的方法来依次记录该数原创 2017-07-22 21:52:02 · 402 阅读 · 0 评论 -
【C++】模板实现双链表和队列
首先来了解模板的定义模板是泛型编程的基础,泛型编程是指编写与类型无关的逻辑代码,是一种复用方式。模板分为模板函数和模板类函数模板的格式:template返回类型 函数名(参数列表){......}类模板的格式:templateclass 类名{......}:templatestruct ListNode{ List原创 2017-04-09 22:26:58 · 245 阅读 · 0 评论 -
浅析智能指针(一)
一.什么是智能指针所谓智能指针就是智能/自动化的管理指针所指向的动态资源的释放。实际上智能指针是一种抽象数据类型,行为表现的像一个指针。通过重载“->”和“*”,就可以像使用指针一样来使用智能指针;而智能指针又是如何来管理指针指向对象的释放问题呢?其实这是RAII的一种应用。RAII(Resource acquisition is initialization),即资源分配即初始化。定义一原创 2017-04-19 13:47:34 · 346 阅读 · 0 评论 -
【数据结构】对称矩阵和稀疏矩阵的压缩存储
1.对称矩阵假设有一个N*N的方阵A,A中任意元素Aij,当且仅当Aij==Aji(0对称矩阵又以对角线为分隔分为上三角和下三角。压缩存储的目的就是为了减小存储空间,对称矩阵的元素有N*(N-1)/2是相同的,所以只需要存储上三角/下山角的数据即可,即有N*(N+1)/2 个数据。看代码实现:templateclass SymmetricMatrix //对称矩阵原创 2017-05-12 19:19:11 · 1599 阅读 · 0 评论 -
【STL】STL 中vector和list的使用
标准模板库(STL)是用于C ++编程语言的软件库,影响了C ++标准库的许多部分。它提供了六个组件,称为算法(alorithms),容器(containers),迭代器(iterators),仿函数(functions),配接器(adapters)和配置器(allocators)。STL提供了一组C ++的常用类,例如容器和关联数组,可以与任何内置类型一起使用,并且支持用户自定义类型的一些基本操原创 2017-04-27 11:11:57 · 451 阅读 · 0 评论 -
【STL】模拟实现list
list是标准模板库中的一个容器,实际上是一条带头节点的双向链表。通过与迭代器的组合使用,使得工作效率大大提高。要注意:迭代器只是为了访问、修改和遍历对象,不对空间进行管理。#pragma once #include using namespace std;//定义链表结点结构体templatestruct __ListNode{ T _data; __ListNode*原创 2017-04-27 17:21:53 · 307 阅读 · 0 评论 -
【数据结构】递归与非递归法遍历二叉树
1.概念树是n个有限数据的集合,像一颗倒过来的树。二叉树是树的一种,只是它的孩子结点最对不超过两个,分别为左孩子和右孩子,左右孩子的次序不能颠倒。2.性质(1).非空二叉树的第i层最多有2^(i-1)个结点(i>0)(2).已知父节点为第i个结点,则它的左孩子为第i*2-1个结点,它的右孩子为第i*2+1个结点(3).有n个结点的二叉树的深度为Log2(n+1)。3.树的存原创 2017-05-12 20:31:18 · 500 阅读 · 0 评论 -
【Linux】守护进程
1.守护进程的定义服务进程不受用户登录注销的影响,且一直运行,这种进程有一个名称叫守护进程,也称精灵进程(Daemon)。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。特点:1). 7*24小时一直运行2).不受用户登录注销影响,无控制终端3).守护进程是孤儿进程,可以认为父进程是init4).守护进程自成一个进程组,自成会话组,与其原创 2017-06-28 21:03:13 · 263 阅读 · 0 评论 -
C语言模式实现C++继承和多态
首先要了解继承和多态。C语言是面向过程的语言,而C++是面向对象的语言,面向对象的三大特性,封装,继承和多态封装:将数据和具体的实现细节都封装在类的内部,只把抽象出来的接口暴露给用户,用户只需要知道如何使用,而不去关心具体的实现细节。这样做可以保证系统的安全性。继承:是一种复用手段,继承是类型之间的关系建模,共享共有的东西,实现各自本质不同的东西。多态:也就是“一个接口,多种形态”,复原创 2017-07-29 14:26:28 · 445 阅读 · 0 评论 -
将二叉搜索树转换成一个排序的双向链表
二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;2. 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;3. 任意节点的左、右子树也分别为二叉查原创 2017-07-29 22:25:19 · 971 阅读 · 0 评论 -
求N!所得的积末尾0的个数
题目:给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3 628 800,N!的末尾有两个0。N!=1 * 2 * 3 * 4 * 5 * 6 * ······ * NN! =(2^X)*(3^Y)*(5^Z) * ······ 又因为是求0的个数,2*5=10刚好可以产生一个0,所以题目可以转换为有多少个2*5,所以取min(X,Z)即Z,求出Z,也就原创 2017-07-22 16:59:53 · 599 阅读 · 0 评论 -
【C++】C++动态内存管理
内存的方式有三种:1.从静态存储区分配,存储空间在程序开始之前就分配好。这块存储空间在程序的整个运行期间都存在。2.在栈上创建,在达到特殊执行点时,存储单元被创建,出了执行点存储单元被自动释放。3.从堆上分配,也称动态内存分配,但要注意释放内存,这块内存的生存期由我们选择决定。首先先回顾C语言中的动态内存管理。在C语言,使用的是malloc/calloc/realloc原创 2017-03-12 11:22:46 · 338 阅读 · 0 评论