原创
文章平均质量分 73
stay_the_course
这个作者很懒,什么都没留下…
展开
-
C++实现红黑树
红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:性质1. 节点是红色或黑色。性质2. 根节点必须是黑色。性质3. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)性质4. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。这些约束强制了红黑树的关键性质: 从根到叶原创 2017-04-10 20:55:04 · 561 阅读 · 0 评论 -
C++实现二叉搜索树基本操作(递归+非递归+应用)
基本概念不再多讲,看下面的例子有如图的序列,用插入法建立二叉搜索树并完成相关操作:代码:#pragma once#include <iostream>#include <assert.h>#include <string>using namespace std;//结点定义template <class K>struct SearchBinaryTreeNode{ K _key原创 2017-04-02 12:16:15 · 358 阅读 · 0 评论 -
C++bitset原理与用法解析
位图(bitset)的原理就是利用每个比特位的0/1这两种状态来表示存在或者不存在这两种状态,比如:有在0~100之间的不重复整数80个,如何判断哪些数在,通常用一个array[100],用这80个数来做array的下标,将存在的下标置为1,遍历数组就能知道知道哪些数据在,但是当数据量比较大的时候,这种方法就显得比较浪费,甚至不可行,比如有40亿个不重复的整数,此时前面的方法明显不可行,因为这些数放原创 2017-04-23 20:42:20 · 1272 阅读 · 0 评论 -
Linux系统编程之atexit()简析
atexit()叫做注册函数,会在main函数return之前调用。我们来看简单的代码:其中的func1()、func2()、func3()、func4()和如图所示的func5()一样,只有一句输出用于标识,然后在main()函数中的代码进入和return之前的位置输出两句话作为标志,我们看到如下的运行结果:由此可以看到atexit()函数有点类似于C++的析构函数,先定义的后析构,atexit(原创 2017-04-26 20:43:46 · 279 阅读 · 0 评论 -
Linux进程之僵尸进程和孤儿进程简析
僵尸进程是指:一个子进程在其父进程没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。如果这个父进程还存在并且一直不调用wait(),那么这个僵尸进程将无法回收,等到其父进程退出后该进程将被init回收。下面我们在Linux环境下验证一下,编写如下代码: 对代码作简要分析,用fork()函数创建进程,fork()函数有两个返回值,给子进程返回0,给父进程返回子进程的PID原创 2017-04-26 20:25:08 · 484 阅读 · 0 评论 -
Linux环境下权限简析
进入一个文件夹或者目录中需要什么权限?x—可执行权限可能我们会觉得是需要可读权限,但其实不然,需要的是可执行权限,我们来作如下验证: 这里用mkdir命令创建了一个名为infile的文件夹,它的初始权限如图中红色方框内画出来的为 dwxrwxr-x(775) ,接下来用chmod指令修改它的权限为666,也就是去掉了它所有者,用户组以及其他使用者的可执行权限,然后用cd指令进入infile,得到原创 2017-03-15 23:07:08 · 320 阅读 · 0 评论 -
TCP和UDP的区别
1.协议报文格式2.数据传输方式TCP数据发送方式为流式发送,收发双方都有数据缓冲区,而且TCP有确认机制,丢包重传,滑动窗口等方式保证其可靠性,并且保证了发送数据的顺序性UDP是发送的是数据包,并且没有确认,也就是说发送端发送出去以后,并不知道发送出去的数据是否到达,也不能保证数据包到达的顺序性3.TCP面向连接,UDP无连接TCP在传输数据之前要进行按此握手建立连接,发送完数据之后要进行四次挥手原创 2017-08-10 10:18:49 · 517 阅读 · 0 评论 -
STL容器 -map和set接口介绍
mapset原创 2017-08-03 20:16:47 · 234 阅读 · 0 评论 -
STL容器——vector接口介绍
vectorvoid push_back(const T& x) //将元素插入于vector的尾端,该函数首先检查是否还有备用空间,如果有就直接在 备用空间上构造元素,调整迭代器finish,如果没有备用空间,就扩充空间(重新配置、移动数据、释放原空间)void pop_back() //将尾端元素删除iterator erase(iterator first,iterator last原创 2017-08-03 21:10:25 · 462 阅读 · 0 评论 -
STL容器——list接口介绍
list首先,list容器是一个不带头结点的双向循环链表,并且在末尾添加了一个不做使用的结点, 用以满足STL迭代器前闭后开的规范。push_front、pop_front、push_back、pop_back // 用法见名知意insert() //用法和vector一模一样,支持三种方式,并且也支持自己调用自己, 且list各个元素的指针不会紊乱(transfer()函数保证)itera原创 2017-08-03 21:11:07 · 299 阅读 · 0 评论 -
指针和引用的对比
1.概念指针值是一个变量的地址,通过解引用指针可以对这个变量进行操作 引用是一个变量的别名,对引用的操作就是对变量本身的直接操作2.声明和定义指针在声明和定义的时候可以赋初值(某个他所要指向变量的地址),也可以根据需要设置为NULL 引用必须用变量初始化,以表示它是哪个变量的引用3.相同点一个变量可以有多个指针指向它,也可以有多个别名,但是指针和引用的底层实现机制都是一样的 下图代码和汇编代码原创 2017-08-11 20:53:09 · 372 阅读 · 0 评论 -
session和cookie
概念session是指终端用户与交互式系统通讯的时间间隔, 注册进入系统到注销离开系统所经历的时间 cookie值得是一些网站将相关信息存储在客户端,用以标识客户端的数据文件(通常经过加密)cookie的主要内容包括名字,值,过期时间,路径和域,其中路径和域一起构成cookie的作用范围会话cookie如果不设置过期时间,那么这个cookie的生命周期为浏览器的持续时间,浏览器关闭,会话结束,co原创 2017-08-18 20:43:25 · 254 阅读 · 0 评论 -
长连接和短连接对比
1.什么是长连接、短连接长连接:就是 client 和 server 在发送数据之前先建立连接,完成之后才能发送数据,并且这个链接不会断开,直到数据传输完成才断开连接。 典型的就是点对点传输。 短连接:client和server只有在传输数据的时候才会建立连接,本次传输完成后立即断开连接。 典型的就是C/S。2.长连接和短连接的操作过程长连接:建立连接->传输数据->保持连接->传输数据->断原创 2017-08-10 08:11:29 · 890 阅读 · 0 评论 -
mybatis-generator插件使用方法
1、导包(以mysql数据库为例)mysql -connector-java mybatis mybatis-spring (集成spring时用到)2、下载mybatis-generator-core插件戳我下载3、下载mysql-connector-java 包4、修改配置generatorConfig.xml文件仔细看注释,绿色汉字写明的地方换路径和包名即可,...原创 2018-08-06 00:21:00 · 330 阅读 · 0 评论 -
java反射详解
java反射是什么AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。一.Class类简单介绍1.什么是Class类Class类简单说就是任何一个类的类型,因为我们常说,java是面向对象的,一切都是对象,而对象又是它属于所属类的一个实例...原创 2018-08-12 00:34:44 · 367 阅读 · 0 评论 -
java多线程之Thread VS Runnable
package ThreadCompare;public class MyThreadByRunnable implements Runnable { private int ticket = 5; @Override public void run() { while(ticket&gt;0) { ticket--; ...原创 2018-08-21 23:35:56 · 157 阅读 · 0 评论 -
C++实现AVLTree
AVLTree就是平衡因子的绝对值不超过1的二叉搜索树,而平衡因子就是右子树的高度减去左子树的高度多得到的值,由二叉搜索树的性质我们可以知道,它比二叉搜索树的要求更为严格,因为二叉搜索树如果遇到的是一个特殊的有序的序列,那么二叉搜索树就会退化成一个链表,如图: 此时,二叉搜索树的时间复杂度就是o(n),而AVLTree由于平衡因子的绝对值不超过1,所以,它的时间复杂度就是o(log n),这也是A原创 2017-04-09 22:08:15 · 371 阅读 · 0 评论 -
单链表面试题(2)
//判断链表是否带环SListNode* IsCircle(SListNode* pHead)//该函数返回的是快慢指针的相遇节点{ if (pHead == NULL) { return NULL; } SListNode* fast = pHead; SListNode* slow = pHead; while (slow != f原创 2017-03-13 23:00:57 · 308 阅读 · 0 评论 -
复杂迷宫问题的递归实现以及最短路径
复杂迷宫就是有多条通路的迷宫,而且要求解最短路的话就要用递归集合栈,用递归探测,寻找所有通路,用栈保存所走过的路径,具体方法为: (1)从当前点为起点探测由它开始能前进的点(这里的探测方向为上,有,左,下); (2)找到能前进的点之后,首先将这个点的坐标压入栈(path)中保存起来,并将这个点的值赋为前一个点的值加1;递归调用这个函数,继续探测; (3)当前结点不能前进之后,将path中的点弹原创 2017-03-12 19:25:26 · 4834 阅读 · 0 评论 -
函数栈帧图解
我们知道内存空间大致可以用下图表示: 而函数在调用的时候都是在栈空间上开辟一段空间以供函数使用,所以下面来详细谈一谈函数的栈帧结构。 如图示,栈是由高地址向地地址的方向生长的,而且栈有其栈顶和栈底,在x86系统的CPU中,寄存器ebp保存的是栈底地址,称为帧指针,寄存器esp保存的是栈顶地址,称为栈指针。而且还应该明确一点,栈指针和帧指原创 2016-11-05 11:55:09 · 11485 阅读 · 5 评论 -
浅谈c#语言的类,事件,对象,方法和函数的区别
在讨论这些关系之前让我们先来了解一下面向过程和面向对象的区别:所谓面向过程就是把一切事物或者需要解决的问题都当做是一个过程来处理,而面向对象则是把一切事物当成一个一个的对象来处理,这两者有什么区别呢,举一个简单的例子: 编写一个驾驶汽车的程序: (1)面向过程的程序设计: 编写一个函数,void drivecar();按过程分步处理具体的这里不做列举。 (原创 2016-11-05 12:09:01 · 4474 阅读 · 0 评论 -
简易版扫雷
简易扫雷 数组原创 2016-09-16 21:16:25 · 302 阅读 · 0 评论 -
c语言模拟实现strcpy函数
模拟实现strcpy#include #include #pragma warning(disable:4996)#include char* my_strcpy(char *dest, const char *src)//const规范使用者对函数的操作{ char *ret = dest;assert(dest != NULL);原创 2016-10-17 23:00:25 · 410 阅读 · 0 评论 -
宏和函数的区别
宏:1.宏会在编译器在对源代码进行编译的时候进行简单替换,不会进行任何逻辑检测,可以理解为文本替换。2.宏进行定义时不会考虑参数的类型。3.参数宏的运行速度会比函数快,因为不需要参数压栈/出栈操作,只是进行了替换。函数:1.函数只在目标文件中存在一处,一次声明就可任意调用,比较节省程序空间。2.函数的调用会牵扯到参数的传递,压栈/出栈操作,速度相对较慢。3.函数的参数存原创 2016-10-19 13:29:22 · 337 阅读 · 0 评论 -
单链表相关操作
#include "test.h"SListNode* BuyNode(DataType x){ SListNode* node = (SListNode*)malloc(sizeof(SListNode)); node->data = x; node->next = NULL; return node;}void PrintSList(SListNode*& p原创 2016-12-08 20:28:36 · 280 阅读 · 0 评论 -
单链表面试题汇总(1)
//逆序打印单链表void PtintTailToHead(SListNode*& pHead){ if (pHead != NULL) { return PtintTailToHead(pHead->next); printf("%d ", pHead->data); }}//删除一个无头结点的非尾节点void DeleteNotTa原创 2016-12-08 20:29:53 · 371 阅读 · 0 评论 -
C++多态——静态多态与动态多态
多态:顾名思义,多态就是多种形态,也就是对不同对象发送同一个消息,不同对象会做出不同的响应。并且多态分为静态多态和动态多态。静态多态就是在系统编译期间就可以确定程序执行到这里将要执行哪个函数,例如:函数的重载,对象名加点操作符执行成员函数等,都是静态多态,其中,重载是在形成符号表的时候,对函数名做了区分,从而确定了程序执行到这里将要执行哪个函数,对象名加点操作符执行成员函数是通过this指针来调用的原创 2017-02-16 16:01:54 · 11774 阅读 · 5 评论 -
菱形继承和菱形虚继承的对象模型
菱形继承就是如下图所示的继承关系,其中A是B和C的父类,B和C是D的父类,由于C++允许多重继承,所以便出现这种菱形继承关系,是问题变得复杂,成员关系以及对象模型更为复杂。 在VS2015小端32位机器下面我们通过一个简单的菱形继承例子来研究一下这种继承关系的对象模型和虚继承的对象模型。class A{public: int _a;};class B : public A{原创 2017-02-17 17:32:32 · 911 阅读 · 0 评论 -
C语言程序的编译、链接具体过程及Linux环境下的具体实例
我们知道一个程序从编写完成到生成可执行文件分为预处理、编译、汇编、链接,最后再生成可执行文件。预处理阶段,预处理器主要做四部分工作,分别是:头文件展开、宏替换、去注释以及条件编译。(1)头文件展开就是编译器会根据字符#开头的命令去读取相应的系统文件或者自定义文件, 并把相应的文件直接插入到当前程序代码中,这就完成了头文件的展开。(2)宏替换就是将程序员自定义的宏变量、宏函数等直接替换,如:#defi原创 2017-02-21 22:59:39 · 1542 阅读 · 0 评论 -
智能指针——AutoPtr & ScopedPer & SharedPtr & WeakPtr
在说智能指针之前先说一下什么是RAII,RAII就是资源分配即初始化,这是一种思想,其最广泛的应用就是智能指针。智能指针就是能自动完成资源的清理和释放。为什么需要智能指针呢?因为有时候写的代码忘了进行指针所指向内存的清理工作,或者有时候代码的运行会提前return或者throw使得本来已经写好的清理代码未曾运行,比如下面的代码:void Test(){ int* ptr = new int原创 2017-03-02 20:36:57 · 625 阅读 · 0 评论 -
迷宫问题的非递归实现
迷宫问题可以抽象为一个二维数组来求解,假设有如图示的迷宫: 解题思路: 用一个栈来存放当前人的位置的坐标,并每次测试当前位置的上、下、左、右,看哪个位置可以继续前进,可以继续前进的位置入栈,并且将人走过的位置的值赋值为2,以此来区分在测试的是时候不会往回走,直至走进死胡同的时候,将走过的位置出栈,并再测试可以前进的位置,依次循环,直至找到出口。 本例代码:#pragma once#incl原创 2017-03-05 21:02:36 · 2364 阅读 · 0 评论 -
C++实现二叉树的基本操作(递归+非递归)
关于二叉树的概念不再赘述,看一个简单例子: 下面看代码:#include <iostream>#include <assert.h>#include <stack>#include <queue>using namespace std;template <class T>struct BinaryTreeNode //结点定义{ T _data; BinaryTre原创 2017-03-19 21:31:01 · 347 阅读 · 0 评论 -
C语言实现控制行数打印星号金字塔
#include <stdio.h>#include <windows.h> int main() { int i, j, k,n; printf("输入要打印的行数:"); scanf_s("%d", &n); for (i = 0; i < n; i++) //...原创 2016-09-21 23:10:37 · 9854 阅读 · 2 评论