c++ & 数据结构
文章平均质量分 77
通过程序讲解c与c++的相关知识.
ps:该专栏内也可能会穿插一些数据结构的知识
Y-ANG
这个作者很懒,什么都没留下…
展开
-
22题:栈的压入、弹出顺序
题目描述输入两个整数序列,第一个序列表示栈的压入序列,请判断第二个序列是否是栈的弹出序列。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。‘思路分析首先考虑这个问题肯定是需要一个辅助栈,方便后边讲思路,我们将压入序列称为pushV,弹出序列称为popV,按照pushV将原创 2017-06-29 12:28:20 · 2972 阅读 · 1 评论 -
二叉树的镜像
题目描述完成一个函数,输入一个二叉树,该函数输出它的镜像。二叉树结点定义如下:struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};原创 2017-06-19 14:50:23 · 958 阅读 · 0 评论 -
重建二叉树
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如图所示的二叉树并输出它的头结点。 分析及实现:思路分析 根据二叉树前序遍历的特点(根-左-右),每次读取的第一个值一定是根节点,这样我们可以在中序遍历的序列中找到原创 2017-05-28 10:24:26 · 7502 阅读 · 4 评论 -
替换空格
题目:请实现一个函数,把字符串中的每个空格替换成”%20”。例如:输入”we are happy.”,则输出”we%20are%20happy.”思路分析: 我们比较替换之前与替换之后的字符串长度,很明显,字符串长度增加了4,所以,第一点,将”we are happy.”用一个字符指针指向肯定不可行,那么就应该将其放入一个数组中。其次我们就应该考虑如何输出想要的结果。 1.题目没有给出要求原创 2017-03-07 16:55:36 · 1218 阅读 · 3 评论 -
旋转数组的最小数字
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小数组。例如数组{3,4,5,1,2}是数组{1,2,3,4,5}的旋转数组,该数组的最小值为1。思路解析:O(N)的算法 这种算法的思想就是遍历这个数组,由于这个数组是两部分有序的数组,因此遍历这个数组时当后一个数字小于前一个数字时,则后一个(即较小)一定为整个数组中最原创 2017-05-25 15:51:19 · 901 阅读 · 4 评论 -
Linux - atime,mtime,ctime以及用touch指令来进行修改
Linux下的文件或目录有三种时间:访问时间(Atime):每当访问这个文件/目录后,Aeecss显示的时间就会更新一次。修改时间(Mtime):当对这个文件进行修改后,Modify显示的时间就更新一次。状态改变时间(Ctime):状态改变时间是指每次用chmod命令改变文件属性后该时间就会更新一次。Linux下的命令stat可以查看这些信息,格式是stat 文件名/目录名原创 2016-12-25 11:14:00 · 5862 阅读 · 0 评论 -
Linux - find命令讲解
windows是我们使用比较熟悉的一个系统,在windows下,文件是以后缀来区分类型的,而且我们也比较熟悉在该系统下怎样去查找一个文件。由于Linux不像windows那样,可以区分文件,并且关于Linux还有一个说法就是“一切皆文件”,在这样一个系统下工作,我们不可避免的要搜索一些指定类型的文件,那么我们怎样去查找呢?!因此这就是我们今天要解决的问题。一、Linux下的查找命令有:原创 2016-12-28 17:00:58 · 703 阅读 · 0 评论 -
Linux - sticky bit
一、粘滞位是什么?粘滞位是Linux下文件权限的一个旗标,当对一个文件设置了粘滞位后,只有owner用户或者root用户才可以对该文件进行删除或移动,但假若不对文件设置粘滞位,任何对该文件具有写和执行权限的用户都可以移动这个文件。因此,对文件设置粘滞位从一方面来将还是对文件有安全保护的。原创 2016-12-30 12:47:58 · 580 阅读 · 0 评论 -
Linux - 实现简易进度条
1.背景知识讲解2.如何实现一个简单的进度条开始今天的内容之前,我们先来回顾一个知识,看下面一段代码(Linux下运行程序)对比上边的代码,似乎相差不大,但是运行结果却千差万别:A图代码运行结果---先输出“hello”,停3秒之后程序运行完毕;B图代码运行结果---执行程序后会先停3秒,然后再输出“hello”。原创 2017-01-01 16:11:35 · 2579 阅读 · 0 评论 -
如何编写一个makefile
一个工程中的源文件不计其数,按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为马克覅了就像一个Shell脚本一样其中也可以执行操作系统的的命令。makefile带来的好处就是:“自动化编译”。一旦写好,只需要一个make命令,就可以使整个工程自动编译,极大提高了软件开发的效原创 2017-01-02 11:33:11 · 5681 阅读 · 0 评论 -
哈夫曼树以及文件压缩的实现
从哈夫曼树到哈夫曼编码再到文件压缩,一步步讲解,一步步实现原创 2016-12-22 22:20:46 · 25018 阅读 · 8 评论 -
设计一个简单的对象池
在将内存池之前需要先回忆一个以前听过的东西----内存碎片。一、内存碎片是什么我们都知道当需要动态开辟内存时,系统都是在堆上开辟一块空间,尽管开辟出来内存的地址是连续的一块内存空间,但每次开辟的内存块的地址并不是连续的,这样的话当我么开辟的次数变多以后,堆上就剩余许多小块的空间导致在我们需要一块比较大的空间时会开辟失败。这是我们最常听到的一种内存碎片,也成为“外碎片”。其实还有另外一种原创 2016-12-07 19:51:23 · 1727 阅读 · 0 评论 -
非比较排序---计数排序&基数排序
如果给出一组数:2, 2, 9, 5, 3, 9,怎样才能遍历一次该数组就能使其有序呢?!试试之间讲的算法,好像都不行。这里我给出另一种排序算法------非比较排序!非比较排序包括计数排序和基数排序。一、计数排序算法思想:很明显,计数排序当然就需要计数啦,这里就是对这组数组中相同的数据进行计数,并以每个数据的相对位置为下标,将统计出来的次数存放在一个count[ ]数组中原创 2016-12-03 10:41:29 · 665 阅读 · 0 评论 -
排序算法---选择排序&堆排序&冒泡排序
直接选择排序、堆排序、冒泡排序及其比较直接选择排序和堆排序都属于选择排序ps:仍以升序为例!一、直接选择排序直接选择排序的思想:选择排序就是通过n-i次关键字的比较,每次从n-i+1个记录中找出最小的关键字,将其与第i个位置的数据交换。void SelectSort(int* a, size_t size){ assert(a); int max = 0; for (size_t i=原创 2016-12-01 14:42:16 · 1329 阅读 · 0 评论 -
排序算法---直接插入排序和希尔排序
排序算法大致可分为:1.插入排序 --- 直接插入排序、希尔排序2.选择排序 --- 选择排序、堆排序3.交换排序 --- 冒泡排序、快速排序4.归并排序本篇博客主要介绍插入排序。。ps:以下两种排序算法都是以升序为例讲解!一、直接插入排序直接插入排序的思想:假设数组第一个数是有序的,从第二个数开始遍历,每拿出一个数就和前面的有序的数比较,如果比它小,就原创 2016-11-26 13:00:42 · 1063 阅读 · 0 评论 -
排序算法---归并排序
一、归并排序的思想:1.每次将一组数分为两组,直到不能再分为止;2.从个数最小的数组开始比较,每次将比较大(或小)的数放入辅助数组中,辅助数组的下标+1,如此循环,直到有一个数组比较完,此时如果另外一个数组有剩余,就将剩余的这些数字全部按顺序加入辅助数组中。从最小的数组向上一步步累加,如果每次小的数组有序,那么合并以后的数组就有序。(下面这幅图给出的是一种分割两个数组的方法,分的时候最好从原创 2016-11-23 21:59:12 · 425 阅读 · 0 评论 -
BTree
B树是一种多叉的平衡搜索树,适合外查找。一棵M叉(M>2)的B树,可以是一棵空树,也可以是具有如下的性质的B树:(M为)1.根节点至少有两个孩子2.每个非根结点有[M/2,M]个孩子3.每个非根结点有[M/2-1,M-1]个关键字,并且是以升序排列4.key[i]与key[i+1]之间的孩子结点的值介于key[i]与key[i+1]之间5.所有叶子节点在同一层以这组数据原创 2016-11-19 12:39:40 · 633 阅读 · 0 评论 -
哈希表---开链法解决哈希冲突
上篇文章已经写过构造哈希表时用开放定址法解决哈希冲突,这次我就来写写这个开链法解决哈希冲突的问题!一、结点定义我们已经知道开链法大概是一种什么结构了,(如果不知道,这里有讲哦点我点我)显而易见,实现哈希桶的话我们就必须多一个指针next,至少这样才看起来有个链表的样子嘛!![cpp] view plain copy//开链法(原创 2016-11-19 10:17:17 · 7480 阅读 · 0 评论 -
哈希表
哈希表,又称为散列表,它是根据关键码(key)直接访问在内存中的存储的一种数据结构。它通过把关键码根据某一函数进行转换后映射到表中的,这个函数称为散列函数,存放记录的数组称为散列表。一、哈希表的构造如何构造一个散列表?!请看这篇博客^-^:散列表的构造和哈西冲突值得一提的是,构造这个表时,我们需要考虑这个位置的状态,是EMPTY,EXIST 还是DELETE?!当表中还没有原创 2016-11-19 10:19:07 · 478 阅读 · 0 评论 -
散列表的构造和哈希冲突
----------------------------该篇文章主要写了散列表的6中构造方法以及处理哈希冲突的两种方法----------------------------一、散列表的构造1.直接定址法:直接定址法是根据关键字得到的某一线性函数值作为散列表地址。f(key) = a*key+b,(其中a,b都为常数)这种方法比较简单,但也有缺陷,这种定址方法需要事先知道关键字的分原创 2016-11-08 14:41:47 · 2845 阅读 · 0 评论 -
平衡搜索树---AVL树
AVL树是一种高度平衡的二叉搜索树,它的每个结点都有一个平衡因子,这个平衡因子的取值是-1,0,1(平衡因子 = 右子树高度 - 左子树高度)AVL树具有的性质:1.左子树和右子树的高度差不超过1;2.树中的各子树都是AVL树一、AVL树结点的定义为了判断每个子树是否平衡,因此在定义AVL树的结点的时候就应该在搜索二叉树的基础上加一个平衡因子_bftemplatestru原创 2016-10-30 10:50:23 · 1412 阅读 · 0 评论 -
平衡搜索树中的左单旋&右单旋&双旋
本文要点:平衡搜索树的左单旋、右单旋、左右双旋、右左双旋在平衡搜索树中进行插入结点时,有可能会破坏整棵树的平衡。为了保证平衡不被破坏,就要对一些节点进行旋转,从而来降低树的高度,这样也能保证树的平衡。原创 2016-10-28 17:34:01 · 7104 阅读 · 7 评论 -
二叉搜索树
二叉搜索树的操作:插入,删除,查找,遍历二叉搜索树也称有序搜索树,它具有如下的性质:1.每个结点都有一个作为搜索依据的关键码(key),每个结点的关键码都不一样2.左子树上所有结点的关键码都小于当前根节点的关键码3.右子树上所有结点的关键码都大于当前根节点的关键吗4.左右子树都是二叉搜索树二叉树的操作:插入,删除,查找,遍历一、插入---Insert当进行插入后,不能破坏二叉搜索树的结构,因此原创 2016-10-26 21:54:15 · 783 阅读 · 0 评论 -
堆排序算法
堆排序算法:根据堆具有的性质,我们可以每次将堆顶的数字(也就是最大或者最小的数字)与对数组尾部的数字交换,然后将堆从树的根部开始向下调整,到已经交换的数字的前一个位置截至,那么这样交换以后后边的数字就是有序的了!void HeapSort(int* a,size_t size){ //建堆 for (int i=(size-1)/2; i>=0; --i) { _AdjustD原创 2016-10-14 18:08:32 · 591 阅读 · 0 评论 -
堆&优先级队列
本文要点:1.堆的实现3.利用堆实现优先级队列一、堆1.堆是一种数组对象,可以被看作一颗完全二叉树结构,堆结构的二叉树存储是一种静态存储。堆又被分为大堆和小堆:大堆:每个父节点大于子节点小堆:每个父节点小于子节点2.堆的实现(以大堆为例)实现一个堆主要在于要建堆和调整。假设现有数组int a[] = { 10, 16, 18, 12, 11, 13,原创 2016-10-14 18:04:57 · 554 阅读 · 0 评论 -
二叉树(二):三种遍历的非递归实现
本文要点:二叉树三种遍历方式(前序、中序、后序)的非递归实现ps:递归实现的链接:二叉树的递归实现原创 2016-09-28 10:12:22 · 2928 阅读 · 1 评论 -
二叉树(一):二叉树的创建以及三种遍历方法的递归实现
我们都知道现实生活中的树长什么样,那么,很明显,二叉树就是一棵“树”,不过它是一个存储数据的一种结构,根在上,向下生长。当然,这样的存储结构只是其中的一种。在这里,就要引出二叉树的存储和二叉树的遍历了!树:n(n>=0)个结点的有限集合,n=0时为空树。二叉树的三种遍历方式原创 2016-09-27 22:07:28 · 12110 阅读 · 1 评论 -
广义表的实现(c++实现)
本文要点:1.广义表的存储结构2.广义表的简单实现,包括:构造、拷贝构造、赋值运算符重载、广义表的大小Size、深度Depth以及输出函数原创 2016-09-26 09:04:12 · 6597 阅读 · 0 评论 -
对称矩阵的存储及转置算法
本文要点:1.对称矩阵与稀疏矩阵2.两种矩阵的压缩存储3.代码实现两种矩阵一、对称矩阵1.对称矩阵也是一种N*N的特殊矩阵,并且满足Aij = Aji(设这个矩阵为A,并且有02.对称矩阵的压缩存储如果把矩阵中的每个元素都存储起来,那么就会显得浪费空间,因为每两个关于对角线对称的元素相等,因此就可以将矩阵压缩存储到一个数组Array中,即:将对称的两个元素存一份原创 2016-09-23 22:42:11 · 6389 阅读 · 0 评论 -
简单迷宫问题的求解
回溯法解决迷宫问题原创 2016-09-11 18:19:02 · 5741 阅读 · 0 评论 -
后缀表达式的计算
1.中缀表达式转后缀表达式;2.后缀表达式的计算原创 2016-09-11 21:57:17 · 34535 阅读 · 2 评论 -
栈的模拟实现
栈的模拟实现原创 2016-09-12 08:36:19 · 1016 阅读 · 0 评论 -
斐波那契数列的递归算法与非递归算法
一、斐波那契数列由于斐波纳挈数列是以兔子的繁殖引入的,因此也叫“兔子数列”。它指的是这样一个数列:0,1,1,2,3,5,8,13......从这组数可以很明显看出这样一个规律:从第三个数开始,后边一个数一定是在其之前两个数的和。在数学上,斐波纳挈数列可以以这样的公式表示:F(0) = 0F(1) = 1 F(n) = F(n-1) + F(n-2),(n>=2)二、斐波纳挈数列的实现原创 2016-09-09 09:22:35 · 64628 阅读 · 15 评论 -
二分查找的递归与非递归
二分查找的算法,递归与非递归的实现原创 2016-09-06 22:11:54 · 2202 阅读 · 0 评论 -
写时拷贝的方式实现C++中string类
写时拷贝的两种实现方式:计数器和引用计数原创 2016-09-04 22:56:46 · 1821 阅读 · 1 评论 -
c++中string的模拟实现
c++中的string类可以实现字符串对象的一系列操作,如下图就是从cplusplus上截取的string的一部分功能:接下来我就简单模拟几个函数实现首先,我们要给出完整的string类,包括构造函数,析构函数,私有成员char* str并且在类内声明要实现的函数(本文我只实现了operator=,operator[ ],pushback(),以及三个operator+原创 2016-08-30 22:03:15 · 1845 阅读 · 0 评论 -
类与对象
由于C++是面向对象的程序设计语言,因此了解一下“面向对象的程序设计”是必须的。这篇文章主要总结了C++的基本概念以及C++的特征,作为初学C++的参考一、什么是面向对象的程序设计二、类与对象原创 2016-06-30 00:27:38 · 433 阅读 · 0 评论 -
关于#define
一、#define1、仅仅作为标识符: #define作为标识符时是没有参数的2、作为宏: #define 作为宏与它作为标识符的区别就是宏有参数而标识符没有 例如:#define MAX(X,Y) ((X)>(Y)?(X):(Y))二、宏与函数的区别1、宏在使用时(编译阶段)会直接被替换掉(即简单的原创 2016-05-14 16:56:02 · 575 阅读 · 0 评论 -
字符串操作函数模拟之番外篇
一、strchr() 函数原型:char *strchr( const char *string, int c ); strchr() 函数查找字符在指定字符串中首次出现的位置,如果找到,就返回指定字符在已知字符串中最后一次开始出现的位置,找不到就返回NULL。例如:已知字符串“abdedef”,该函数返回“dedef”#include#include#in原创 2016-05-14 17:39:13 · 390 阅读 · 0 评论 -
内存操作函数memcopy和memmove
我们以前在拷贝一个字符串时只想到过strcpy()函数拷贝,但是这个函数在使用时存在一定的缺点,一方面它只能用来拷贝字符串并不能拷贝其他类型的数据,另一方面它只有在遇到'\0'时才结束拷贝,所以容易溢出。所以,就引入memcpy()这个内存操作函数。首先,先看一下二者的区别:memcpy:1.函数原型:void *memcpy( void *dest, const void原创 2016-05-21 15:22:35 · 730 阅读 · 0 评论