自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(67)
  • 收藏
  • 关注

原创 依赖属性和附加属性

重混江湖后的第一篇文章,竟然有些手生......(惶恐+惭愧)ing,怕是套路也要有些变化了-_-一.属性    刚着手开始学习C#的时候,不明白为什么会有属性这个东西,不是已经有了字段了吗,你说属性里面有get和set方法对数据进行了封装,可以通过对方法的访问限定来控制该属性是否可以被赋值,但是不也有readonly这个关键字可以用来修饰字段吗,你又说可以通过在get

2017-10-20 14:56:41 7239 5

原创 漫谈shell脚本

一. 关于shell    shell,英文是壳,外壳的意思,至于在计算机中,同样有这样的一层意思,也就是可以将shell看做是计算机系统封装的一层外壳,来供用户使用,因此,用户可以通过操纵shell也就是输入一系列命令来达到各种需要的目的,那么shell也可以被称为命令解释器。    在shell下,用户可以键入一行命令而shell解释一行来使其依次执行不同的任务,这种方式称为交互式,如果在执行

2017-10-20 20:42:54 4583 1

原创 数据库之——索引、触发器、事务(存储引擎)

一. 数据库    数据库(DataBase)是按照数据结构来组织、存储和管理数据的仓库。其主要特点有如下几个方面:实现数据共享数据共享包含所有用户可同时存取数据库中的数据,也包括用户可以用各种方式通过接口使用数据库,并提供数据共享;减少数据的冗余度同文件系统相比,由于数据库实现了数据共享,从而避免了用户各自建立应用文件。减少了大量重复数据,减少了数据冗余,维护了数据的一致性;数据的独立性数据的独

2017-10-20 20:42:51 4920

原创 关于HTTP中的keep-alive

一. 关于HTTP    首先,HTTP是超文本传输协议,是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,其主要特点有如下:支持客户/服务器模式;简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快;灵活:HT

2017-10-20 20:42:49 4671

原创 字符串的排列——28

输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。    对于一个字符来说,只有一个排列就是其自身,那么对于多个字符的组合来说,也是有规律可循的:可以在字符串中选出一个字符来固定出头部,比如上述先用a来开头,那么后面的部分就由b、c来组成,之后再将b、c分别更换为头部,后面的就由剩下

2017-10-20 20:42:46 4451

原创 二叉搜索树与双向链表——27

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表,要求不能创建任何新的结点,只能调整树中结点指针的指向。650) this.width=650;" src="http://s5.51cto.com/wyfs02/M01/82/0A/wKiom1dIRfrxQCSkAAAJnPK-y1I749.png" title="二叉搜索树.png" alt="wKiom1dIRfrxQCSkAAAJ

2017-10-20 20:42:43 4513

原创 IO复用之——epoll

一. 关于epoll    对于IO复用模型,前面谈论过了关于select和poll函数的使用,select提供给用户一个关于存储事件的数据结构fd_set来统一监测等待事件的就绪,分为读、写和异常事件集;而poll则是用一个个的pollfd类型的结构体管理事件的文件描述符和事件所关心的events,并通过结构体里面的输出型参数revents来通知用户事件的就绪状态;    但是对于上述两种函数,

2017-10-20 20:42:40 4595

原创 复杂链表的复制——26

实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext的指针指向下一个结点外,还有一个m_pSibling的指针指向链表中任意结点或者NULL。如下如所示的一个复杂链表,没有画出_sib指针的结点表示_sib指向NULL:650) this.width=650;" src="http:/

2017-10-20 20:42:37 4297

原创 IO复用之——poll

一. 关于poll    对于IO复用模型,其优点无疑是免去了对一个个IO事件就绪的等待,转而代之的是同时对多个IO数据的检测,当检测等待的事件中至少有一个就绪的时候,就会返回告诉用户进程“已经有数据准备好了,快看看是哪个赶紧处理”,而对于IO复用的实现,除了可以用select函数,另外一个函数仍然支持这种复用IO模型,就是poll函数;二. poll函数的用法    虽然同样是对多个IO事件进行

2017-10-20 20:42:34 4522

原创 IO复用之——select

一. select    前面提到Linux下的五种IO模型中有一个是IO复用模型,这种IO模型是可以调用一个特殊的函数同时监听多个IO事件,当多个IO事件中有至少一个就绪的时候,被调用的函数就会返回通知用户进程来处理已经ready事件的数据,这样通过同时等待IO事件来代替单一等待一个IO窗口数据的方式,可以大大提高系统的等待数据的效率;而接下来,就要讨论在Linux系统中提供的一个用来进行IO多

2017-10-20 20:42:31 4615

原创 二叉树中和为某一值的路径——25

输入一个二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。650) this.width=650;" src="http://s2.51cto.com/wyfs02/M00/80/EF/wKiom1dFDnWQdxTiAAALYrM1qGA376.png" title="二叉树another.png" alt="wKiom1d

2017-10-20 20:42:28 4444

原创 二叉搜索树的后序遍历序列——24

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入数组的任意两个数组都互不相同。650) this.width=650;" src="http://s2.51cto.com/wyfs02/M00/80/E9/wKiom1dESJeTyQIzAAAJnPK-y1I086.png" title="二叉搜索树.png" alt="wKiom

2017-10-20 20:42:25 4441

原创 从上往下打印二叉树——23

从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如如下二叉树打印出的结果为1、2、3、4、5、6、7、8、9。650) this.width=650;" src="http://s2.51cto.com/wyfs02/M01/80/40/wKioL1c8J7SxEeWMAAAdonuXRV4682.png" title="二叉树.png" alt="wKioL1c8J7SxE

2017-10-20 20:42:22 4437

原创 基于UDP协议之——socket编程

一. socket API    前面一篇《基于TCP协议之——socket编程》http://2627lounuo.blog.51cto.com/10696599/1775559已经花了大量的篇幅讲述了socket和使用基本的socket API所需要注意的问题,这里就不再赘述了。下面主要谈论的是UDP和TCP在socket编程中的不同之处;1. 创建sock    和TCP面向连接的可靠的字节

2017-10-20 20:42:14 4712

原创 栈的压入、弹出序列——22

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈顺序,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。    首先,可以在第一个序列也就是压栈顺序中找第二个序列中第一个元素,是4,因为第二个序列中第一个元素是第一个被弹出的,那么在压入顺序

2017-10-20 20:42:12 4384

原创 基于TCP协议之——socket编程

一. 套接字(socket)    socket英文为插座的意思,也就是为用户提供了一个接入某个链路的接口。而在计算机网络中,一个IP地址标识唯一一台主机,而一个端口号标识着主机中唯一一个应用进程,因此“IP+端口号”就可以称之为socket。    两个主机的进程之间要通信,就可以各自建立一个socket,其实可以看做各自提供出来一个“插座”,然后通过连接上“插座”的两头也就是由这两个socke

2017-10-20 20:42:09 4759

原创 二叉树的镜像——19

完成一个函数,输入一个二叉树,该函数输出它的镜像。650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/80/35/wKiom1c7DRSj9efNAABKfkin-40769.png" title="镜像.png" alt="wKiom1c7DRSj9efNAABKfkin-40769.png" />    镜像其实就是在转变成镜子当

2017-10-20 20:42:06 4272

原创 树的子结构——18

输入两棵二叉树A和B,判断B是不是A的子结构。如图:二叉树B就是二叉树A的一棵子树,而二叉树C不是二叉树A的子树。650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/80/1D/wKioL1c4cpWi2XS9AAAT9JRAPdE913.png" title="二叉树.png" alt="wKioL1c4cpWi2XS9AAAT9J

2017-10-20 20:42:03 4431

原创 包含min函数的栈——21

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push、及pop的时间复杂度都是O(1)。    首先,栈的特点是“先进后出,后进先出”,因此,对于pop和push两个操作自然都是直接放入栈顶和直接在栈顶删除元素,那么如果要找栈中的最小值min,因为要求时间复杂度为O(1),因此肯定不能遍历栈找出最小元素,这里可以想到使用在这个栈的数据结构中使用两个

2017-10-20 20:42:01 4413

原创 顺时针打印矩阵——20

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如,输入如下矩阵:        1  2  3  4        5  6  7  8        9  10  11  12        13  14  15  16则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。    其实顺时针的打印,无非就是先打印出矩阵最外面的第一行,然后

2017-10-20 20:41:58 4449

原创 TCP之————三次握手和四次挥手

一. TCP协议    TCP(Transmission Control Protocol)传输控制协议,是TCP/IP协议族中最重要的协议之一,主要工作在运输层,和UDP不同,TCP提供面向流服务面向连接的可靠传输服务,虽然是面向字节流的,但TCP的传输单元却是报文段,一个报文分为首部信息和有效数据信息两部分,其中的首部信息才是在传输过程中起到至关重要的作用;------------------

2017-10-20 20:41:55 4394

原创 代理服务器和NAT技术

一. 代理服务器    所谓“代理”一词,就是代为管理代而劳之的意思,而代理服务器充当的角色就是中转站,使一个网络终端和另一个网络终端并不直接进行相连,代理网络用户去取得网络信息,是一种特殊的网络服务,主要工作在OSI的会话层中,有利于保障网络终端的隐私和安全,起到防火墙的作用。    一个完整的代理请求过程为:客户端首先与代理服务器创建连接,接着根据代理服务器所使用的代理协议,请求对目标服务器创

2017-10-20 20:41:52 300

原创 合并两个排序的链表——17

输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。    要合并两个递增的链表,首先找出两个链表的头结点中较小的一个就为合并后新链表的头结点,之后再依次将两个链表中的结点值进行相比较,依次将较小值在新链表中进行尾插,直到其中一个链表遍历完成,将剩余链表直接链在新链表的尾部就可以了,因为链表本来就是有序递增的;程序设计如下:#include #include using 

2017-10-20 20:41:49 340

原创 反转单链表——16

定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。    要反转一个单链表也就是使链表中的结点逆置,但并不是遍历链表每一次都将结点重新创建进行头插,这样就是重新创建一个单链表了而不是将原有的单链表逆置;因此,可以想到用多个指针来操控,既要防止找不到下一个结点的问题,也要解决逆置链表的链接问题;程序设计如下:#include #include using namespace s

2017-10-20 20:41:47 206

原创 链表中倒数第k个结点——15

输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6,这个链表的倒数第3个结点是值为4的结点。    因为链表是单链表,因此不可能先找到链表的最后一个结点,再倒回去数k个结点;因此有一种方法就是可以先将链表依次遍历一遍得到链表总结点个数n,然后链表中倒数第k个结点也就

2017-10-20 20:41:44 168

原创 ARP数据报传送格式

一. ARP    ARP协议是运行在网络体系中数据链路层的协议,用于在局域网内,当知道要发送目的地主机的IP地址和端口号但是却不知道MAC地址的时候,就需要用到ARP也被称为地址解析协议;因为数据链路层传输的数据格式是帧,接收方接收的时候是先经过物理层和数据链路层才到达网络层的,因此,在数据传输的时候是需要知道主机的MAC地址也就是其硬件地址的来发送和接收数据的;如果接收到的数据包的MAC地址与

2017-10-20 20:41:41 1056

原创 Linux之————守护进程与crond定时任务

一. 守护进程    守护进程又称为精灵(Daemon)进程,顾名思义,守护是一直会存在的,它是运行在后台的一种特殊的进程,独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。比如当Linux系统启动的时候会启动一些系统服务进程,因为这些进程没有控制终端因此不能直接和用户进行交互,它的生命周期随系统,而不是像用户登录或者运行程序才开始启动的而进程运行完毕或者用户注销后就终止,这种进程就

2017-10-20 20:41:38 2497

原创 打印1到最大的n位数——12

输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3...一直到最大的3位数即999。        其实一看这个题,就可以想到用一个循环来打印,循环次数就为10的n次方减一,即输入3循环999次依次打印出所对应的值。但是,有一个重要的点就是,如果n的值很大,大到溢出了所能表示的最大整型范围的值,比如用long long数据类型都存放不下了要怎么办呢?这就可以考虑,用字

2017-10-20 20:41:35 234

原创 调整数组顺序使奇数位于偶数前面——14

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。     首先,可以想到,用前后两个指针一个在数组首一个在数组尾同时往数组中间遍历,当遇到前指针遇到偶数后指针遇到奇数时,就将两个数交换,直到两指针相遇或者前指针超过了后指针,这个有点类似快速排序的思想;程序设计如下:#include #include using namespace

2017-10-20 20:41:32 187

原创 在O(1)时间删除链表结点——13

给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。    因为要求时间复杂度为O(1),所以肯定不能遍历链表,那样的话时间复杂度就是O(N)了;可以想到,其实要求删除该结点,真正的目的并不是要将结点的数据包括结点所占的内存都给删除,只是想让数据消失就可以了,至于结点,除去任意一个结点所占的空间都是OK的;    所以,这里换一种思路,若要删除指定的结点,一般需要将前一个结点

2017-10-20 20:41:29 198

原创 数值的整数次方——11

实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。    首先可以想到的是,如果exponent是个大于零的数,可用循环来进行相乘,而如果exponent是个复数,依然可以将base进行相乘,最后再取其倒数也就是用1去除以相乘结果。程序设计如下:#include #include usi

2017-10-20 20:41:27 216

原创 线程安全与可重入函数的区别与联系

一. 线程安全    前面提到过线程的同步与互斥,也就是当两个线程同时访问到同一个临界资源的时候,如果对临界资源的操作不是原子的就会产生冲突,使得结果并不如最终预期的那样,比如如下的程序:#include #include int g_val = 0;void* fun(void *arg){    int i = 0;    while(i++ 上面创建了两个线程,我们知道,同一个进程中的线程之

2017-10-20 20:41:24 468

原创 Linux之————信号

一. 信号                                        我们在shell下运行起来一个程序,可以在这个进程正在运行的时候键盘输入一个Ctrl+C,就会看到这个进程被终止掉了,其实当我们键入Ctrl+C的时候是向进程发送了一个SIGINT信号,这时候产生了硬件中断则系统会从执行代码的用户态切入到内核态去处理这个信号,而一般这个信号的默认处理动作是终止进程,因此正在运

2017-10-20 20:41:21 212

原创 一个数的二进制表示中1的个数——10

实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如,将9表示成二进制为1001,有2位是1,因此如果输入数字9,该函数输出2。    如果让我们将一个十进制的数转换成二进制的表示,我们就会不停的模除模除2取它的余数,因此,就可以用这样的方法解决:#include using namespace std;size_t count_one_num(int n){    size_t cou

2017-10-20 20:41:18 423

原创 求斐波那契数列的第n项值——9

写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。斐波那契数列的定义如下:         0            n = 0        F(n) =  1            n = 1         F(n-1)+F(n-2)    n > 1也就是斐波那契数列为{0,1,1,2,3,5,8,13,21,......F(n-1)+F(n-2)};    首先可以想到,

2017-10-20 20:41:15 1457

原创 输出一个为递增排序数组的旋转数组中的最小元素——8

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为数组{1, 2,3, 4, 5}的一个旋转,该数组的最小值为1。    当然了,将数组遍历一遍肯定能找出最小值,但其时间复杂度为O(N),效率是最低的,因此,应该有一种更高效的解决办法。        因为原数组是递增的,因此数组的第一个元素一

2017-10-20 20:41:12 271

原创 函数指针和回调函数的事

一. 函数指针    关于函数指针的概念,可以想到一个整型指针指向的是一个整型,它的值是所指向对象的地址;一个字符串指针指向的是一个字符串,它的值是所指向字符串的首地址;因此,一个函数指针当然是一个指针变量了,它所指向的是一个函数,它的值就是所指向函数的入口地址。函数指针的定义如下:typedef int data_type;data_type (*pfun)(data_type, data_ty

2017-10-20 20:41:09 183

原创 C++中的单例模式——2

有时候实现了一个类,但只需要创建出一个实例化的对象就能完成需求,如果有太多的对象不仅浪费内存空间也会使得代码数据不那么好维护,因此会需要设计出一个只能生成一个实例的类;    首先,要使得这个类只能实例化出一个对象,那么它的构造函数肯定不能够被外部随意调用,因此应该将类的构造函数的访问限定符设定为私有的,但是这样的话,如何获得唯一一个的实例化对象呢?可以设计一个成员函数,这个成员函数只能分配出唯一

2017-10-20 20:41:06 161

原创 用一棵二叉树的前序遍历结果和中序遍历结果还原这棵二叉树——6

输入某二叉树的前序遍历和中序遍历的结果,重建出这棵二叉树,假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出这棵满足前序遍历和中序遍历的二叉树并输出它的头结点。    对一棵二叉树前序遍历的顺序是“根结点->左结点->右结点”,而中序遍历的顺序是“左结点->根节点->右结点”,因此

2017-10-20 20:41:03 790

原创 用两个栈实现一个队列——7

用两个栈实现一个队列,并实现两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。    栈的特点是“先进后出,后进先出”,而队列的特点是“先进先出,后进后出”,因此可以想到只用一个栈是无法完成的,所以会需要两个栈,先将输入的数据都依次放入一个栈stack1中,但是先进去的数据会被压在栈底,而栈底的数据是需要最先被取出的,可画图如下:650) t

2017-10-20 20:41:01 180

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除