自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++实现线程安全单例类

1.什么是单例模式单例模式是一种非常常用的设计模式,几乎在稍大的工程项目中都会用到。单例类保证在全局中只有唯一一个类的实例对象,并且在类的内部提供了获取这个唯一实例的接口。在类中,实例化出一个对象需要调用构造函数,为了防止在类的外部调用构造函数构造出实例,对类的构造函数就应有所限制,可以将构造函数的访问权限设置为private或protected。还要提供一个访问实例的接口,在类中定义一个stati

2017-08-03 17:11:09 1862

原创 使用shell脚本实现希尔排序

之前讲过如何进行希尔排序,在此就不赘述了。插入排序和选择排序算法http://blog.csdn.net/zhangyi_zy/article/details/74942516今天是利用Shell脚本语言实现希尔排序,在此之前,先简单了解Shell脚本语言。Shell的作用是解释执行用户的命令,有两种执行方式:交互式(Interactive):用户输入一条指令,Sh

2017-08-01 17:21:17 672

原创 将二叉搜索树转换成一个排序的双向链表

二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;2. 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;3. 任意节点的左、右子树也分别为二叉查

2017-07-29 22:25:19 977

原创 C语言模式实现C++继承和多态

首先要了解继承和多态。C语言是面向过程的语言,而C++是面向对象的语言,面向对象的三大特性,封装,继承和多态封装:将数据和具体的实现细节都封装在类的内部,只把抽象出来的接口暴露给用户,用户只需要知道如何使用,而不去关心具体的实现细节。这样做可以保证系统的安全性。继承:是一种复用手段,继承是类型之间的关系建模,共享共有的东西,实现各自本质不同的东西。多态:也就是“一个接口,多种形态”,复

2017-07-29 14:26:28 447

原创 重建二叉树

题目:由前序遍历和中序遍历重建二叉树前序序列:1 2 3 4 5 6 中序序列:3 2 4 1 6 5思路:每次以前序遍历序列的第一个数作为根结点,再在中序遍历序列里边找到根结点。根据中序遍历的特点我们可以知道,只有左子树全部访问完之后才会访问根结点,所以我们找到根结点之后,发现根结点之前的数都是根结点的左子树的所有结点,右边的数都是根结点右子树的所有结点。那么,可以以根结点为

2017-07-28 16:31:44 308

转载 二叉树经典面试题4~判断一棵树是否是完全二叉树

二叉树经典面试题4~判断一棵树是否是完全二叉树分类: 剑指offer刷题(12) 作者同类文章X版权声明:本文为博主原创文章,未经博主允许不得转载。 一.问题描述  有一棵树判断该树是否是完全二叉树?二.问题分析1.完全二叉树的定义?  判断一棵树是否是完全二叉树,首先要知道什仫是完全二

2017-07-27 19:03:51 1243

原创 判断一颗二叉树是是否是另一颗树的子树

例如treeB是treeA的子树,那么如何判断B是A的子树呢?要做这道题,可以将过程分为两步:第一步,找到两棵树根节点有相同的值,只有根节点的值相同才有往下判断的必要;第二步,找到相同根节点之后,再判断根节点的子树是否包含B树一样的结构。注意:空树不是任何树的子树详细分析第一步:首先要找与B树根节点值相同的结点,那么就从A树的根节点2开始遍历,如果A树根结点的值与B树相同,

2017-07-27 16:54:10 621

原创 求差集:已知集合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 698

原创 迷宫最短路径求解

上节中只是提到了如何找到迷宫的通路,但是很显然有些迷宫不止一条通路,所以怎样才能求得迷宫最短路径呢?要找到最短路径,那必然需要知道所有的路径,才能找出最短路径。所以最重要的还是利用栈和回溯法,同时和递归结合起来。思路:首先从入口点开始,查找下一个结点的时候要与当前结点进行比较,因为所有路过的结点都是被标记的,表示的是从入口点到当前点所走的长度,而且都是递增。所以有可能被比较的对

2017-07-25 18:41:59 2253

原创 迷宫问题求解

如图,用1表示墙,用0表示通路,entry表示入口,exit表示出口,那么如何找到一条通路,用栈和递归方法都可以实现。一.用栈求解1.首先给定一个入口点,从入口点开始找。2.将入口点压栈,以后遇到的每一个合法位置的数据也要压栈,并且标记出来,表示走过的路径。3.判断哪些点能走通,也就是哪些点可以压栈,分别对当前位置的四个方向进行探测即可。找到能走的方向,循环上述过程

2017-07-25 17:37:32 508

原创 判断一棵树是否为平衡树及求树的高度

什么是平衡树?所谓平衡树,就是树的任意结点的左子树和右子树的高度之差的绝对值不超过1。所以判断一棵树是否为二叉树,不难想到可以先求出树的高度,再求出左右子树的高度差来判断,那么就想先求树的高度。求树的高度可以用递归方法,树的高度其实是返回左右子树中高度较高的那一个,求当前的高度则还要再加1。1.求树的高度size_t _Depth(Node* root){ if (root =

2017-07-24 17:41:35 3600 1

原创 链表翻转(每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 1907

原创 类型萃取

POD类型萃取POD: plain old data 平凡类型(⽆关痛痒的类型)--基本类型C++可以通过typeid获取到⼀个类型的名称,但是不能拿来做变量的声明。所以我们可以通过类型萃取对内置类型和非内置类型进行区分,其原理就是将内置类型全特化,这样我们在进行拷贝的时候就可以对内置类型和非内置类型进行不同的处理来提高效率。像sting这种深浅拷贝的问题也可以解决。主要应用:Se

2017-07-23 17:45:54 323

原创 求数组中次数超过一半的数字

一个数组中有一个数字的次数超过了数组的一半,求出这个数字。如:int a[]={2,3,2,2,2,2,2,5,4,1,2,3},求出超过一半的数字是2。这个问题有两种解法,第一种是依靠数组的特点来找出这个数,第二种是利用排序的思想来找,下面依次介绍这两种方法。1.利用数组本身的特性题目给出这个数出现的次数超过了数组元素个数的一半,假设数组为a[n],如果用计数的方法来依次记录该数

2017-07-22 21:52:02 405

原创 求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 605

原创 shell彩色进度条

在编写进度条之前,首先要了解一些基本知识。在linux下,\r是回车,回车是表示将光标移动到当前行的起始位置,\n是换行,换行表示将光标一定到当前行的下一行,保持还在一列。而我们所编写的进度条就是不断刷新输入的内容,又因为不需要换行,所以在视觉上就会有一直在往前输出的感觉。linux在命令行下也能产生不同颜色的背景和字体,只需要加上一些颜色代码,例如echo -e "\033[44

2017-07-14 15:58:57 406

原创 TCP服务器通信

单进程版本的Server.c#include #include #include #include #include #include #include //user usagestatic void usage(const char* proc){ printf("usage: %s [local_ip] [local_port]\n", proc);}//tcp

2017-07-14 11:48:58 509

原创 插入排序、选择排序、交换排序和归并排序

常见的比较算法有:排序算法的稳定性:假定在待排序的序列中,存在多个相同的关键字,若经过排序,这些关键字的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。一、插入排序1.直接插入排序思想:直接插入排序是在已有有序序列的基础上,在最末尾插入一个数,依次起从最大的数开始比较,如果大

2017-07-11 11:10:45 1761

原创 调研NAT技术和代理服务器

NAT技术———-——————————1.简介Network address translation (NAT)网络地址转换是一种将一组IP地址空间映射到另一组IP地址空间的技术,通过修改IP协议数据报报头中的地址信息来实现,并且通过流量路由设备进行传输。2. 为什么需要转换由于保密原因或 IP 在外网不合法,网络的内部 IP 地址无法在外部网络使用,就产生了 IP 地址转换的需求。局域网络以外的网

2017-07-07 20:14:52 442

原创 【Linux】CRC校验

1.crc简介循环冗余校验(CRC)是数字网络和存储设备中通常使用的错误检测码,用于检测原始数据的意外变化,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,并且在检查值不匹配的情况下,可以采取针对数据损坏的纠正措施,以保证数据传输的正确性和完整性。2.crc基本工作原理1)发送端将发送数据比

2017-07-03 21:45:51 1222

原创 【Linux】认识crond和crondtab

1.crond定义Crond由crontab(cron表)文件驱动,该文件是一个配置文件,用于定期执行shell命令。crond服务通常被放在/etc/init.d/crond , 这样就可以在系统启动后自动启动crond服务。crontab文件存储在保存cron守护程序的作业列表和其他指令的位置。Crond服务会定期(默认一分钟检查一次)检查系统中是否有要执行的任务工作。权限:用户可以拥

2017-06-30 11:04:12 477

原创 【Linux】守护进程

1.守护进程的定义服务进程不受用户登录注销的影响,且一直运行,这种进程有一个名称叫守护进程,也称精灵进程(Daemon)。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。特点:1). 7*24小时一直运行2).不受用户登录注销影响,无控制终端3).守护进程是孤儿进程,可以认为父进程是init4).守护进程自成一个进程组,自成会话组,与其

2017-06-28 21:03:13 267

原创 【数据结构】递归与非递归法遍历二叉树

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 503

原创 【数据结构】对称矩阵和稀疏矩阵的压缩存储

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 1610

原创 【STL】模拟实现list

list是标准模板库中的一个容器,实际上是一条带头节点的双向链表。通过与迭代器的组合使用,使得工作效率大大提高。要注意:迭代器只是为了访问、修改和遍历对象,不对空间进行管理。#pragma once #include using namespace std;//定义链表结点结构体templatestruct __ListNode{ T _data; __ListNode*

2017-04-27 17:21:53 313

原创 【STL】STL 中vector和list的使用

标准模板库(STL)是用于C ++编程语言的软件库,影响了C ++标准库的许多部分。它提供了六个组件,称为算法(alorithms),容器(containers),迭代器(iterators),仿函数(functions),配接器(adapters)和配置器(allocators)。STL提供了一组C ++的常用类,例如容器和关联数组,可以与任何内置类型一起使用,并且支持用户自定义类型的一些基本操

2017-04-27 11:11:57 459

原创 浅析智能指针(一)

一.什么是智能指针所谓智能指针就是智能/自动化的管理指针所指向的动态资源的释放。实际上智能指针是一种抽象数据类型,行为表现的像一个指针。通过重载“->”和“*”,就可以像使用指针一样来使用智能指针;而智能指针又是如何来管理指针指向对象的释放问题呢?其实这是RAII的一种应用。RAII(Resource acquisition is initialization),即资源分配即初始化。定义一

2017-04-19 13:47:34 349

原创 【C++】模板实现双链表和队列

首先来了解模板的定义模板是泛型编程的基础,泛型编程是指编写与类型无关的逻辑代码,是一种复用方式。模板分为模板函数和模板类函数模板的格式:template返回类型    函数名(参数列表){......}类模板的格式:templateclass  类名{......}:templatestruct ListNode{ List

2017-04-09 22:26:58 247

原创 【C++】继承(菱形继承)

面向对象编程一.继承在面向对象编程中,继承是当对象或类基于另一个对象(原型继承)或类(基于类的继承)时,使用相同的实现(从对象或类继承)或指定新的实现来维护相同的行为。这样的继承类被称为其父类或超类的子类。它是代码重用的一种机制,允许通过公共类和接口独立扩展原始软件。继承是类型之间的关系建模,共享公有的东西,实现各自的本质。1.继承的三种关系(1)公有继承(public):

2017-04-03 23:01:52 610

原创 【LINUX】Linux下的粘滞位

In computing, thesticky bit is a user ownership  access right flag that can be assigned to files and directories on Unix-like systems.    When a directory's sticky bit is set, the filesy

2017-03-31 23:18:08 383

原创 【LINUX】find命令

Linux下的find命令提供了诸多查找条件,具有强大的搜索功能。我们可以利用find命令在目录结构中搜索文件并执行相应的操作。命令格式:find pathname -options1.按文件名进行查找     -namepathname:find 命令的查找路径。-exec:find 命令对匹配文件执行该参数所给出的shell命令。2.按文

2017-03-24 21:29:04 239

原创 【LINUX】Linux权限管理

ls命令是用来列出目录下的文件,列出目录下所有文件以及详细信息我们用ls -la. 同样也可以用ll,而ls -a还会列出以 . 开头的隐含文件。由图可知,每个文件有七列,这七列分别代表-rw-rw-rw-. 1 zy zy 8 Mar 19 00:47 test1.c[类型和权限] [链接数] [

2017-03-19 16:19:39 554

原创 【C++】C++动态内存管理

内存的方式有三种:1.从静态存储区分配,存储空间在程序开始之前就分配好。这块存储空间在程序的整个运行期间都存在。2.在栈上创建,在达到特殊执行点时,存储单元被创建,出了执行点存储单元被自动释放。3.从堆上分配,也称动态内存分配,但要注意释放内存,这块内存的生存期由我们选择决定。首先先回顾C语言中的动态内存管理。在C语言,使用的是malloc/calloc/realloc

2017-03-12 11:22:46 345

原创 【C语言】静态顺序表

静态顺序表

2017-03-11 10:02:35 328

原创 【C语言】c语言实现简单的链表(续)

本篇文章的代码是在上一篇代码的基础上,实现了链表的合并;实现了约瑟夫环;并且判断两条链表是否有交点等功能;检查链表是否为环,若是环又如何去计算环的长度以及查找环的入口;查找环的入口思路如图示:要实现的接口如下:#ifndef _SLIST_H__#define _SLIST_H__#include #include #include t

2017-03-10 10:05:47 326

原创 【C语言】C语言实现简单的链表

链表是一种线性表,但是并不是顺序存储,而是每个结点存储着下一个结点的地址,把存储数据元素的数据串联起来。

2017-03-09 22:04:04 352

原创 【C语言】注释转换(C语言->C++)

代码如下.h文件#ifndef __COMMENT_CONVERT__#define __COMMENT_CONVERT__#include #include enum STATE{ NUL_STATE, C_STATE, CPP_STATE, END_STATE,};void DoConvertWork(FILE *pfIn, FILE *pfOut);

2017-02-20 22:07:00 404

原创 【C语言】一元二次方程的解

对于一元二次方程的解,并没有难的地方,不过有一个细节需要注意。浮点数在与零值进行比较时,不能将浮点变量用" == "或" != "与任何数字比较。不管是float还是double类型的变量,都有精度限制。所以在比较时应将其设法转化成" >= "或" 指针变量在与零值比较时,应将指针变量用" == "或" != "与NULL 值比较。布尔变量与零值比较时,不可直接与TRUE或FA

2017-01-13 15:36:59 851

原创 【C语言】找凶手

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯中的一个。以下为4个嫌疑犯的供词:A说:不是我。B说:是C。C说:是D。D说:C在胡说。已知3个人说了真话,1个人说的是假话。请找出凶手。#include "stdio.h"int main(){ int i = 0; char liar = 0; int sum = 0; for (i =

2017-01-12 16:06:42 893

原创 【C语言】折半查找

#include int Search(int arr[], int n, int m){ int left = 0; int right =m; while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == n) { return n; }

2017-01-12 15:35:27 469

空空如也

空空如也

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

TA关注的人

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