宇哲

私信 关注
宇哲_安菲尔德
码龄6年
  • 506,330
    被访问量
  • 160
    原创文章
  • 9,804
    作者排名
  • 420
    粉丝数量
  • 于 2015-03-22 加入CSDN
获得成就
  • 获得256次点赞
  • 内容获得84次评论
  • 获得519次收藏
荣誉勋章
TA的专栏
  • 一起学习C/C++
    102篇
  • 算法刷题之路
    12篇
  • linux
    27篇
  • C
    50篇
  • C语言基础
    1篇
  • 刷题
    2篇
  • Git
    3篇
  • 剑指offer
    11篇
  • 数据结构
    33篇
  • C++
    21篇
  • python学习
    3篇
  • 计算机网络
    8篇
  • 最近
  • 文章
  • 资源
  • 问答
  • 课程
  • 帖子
  • 收藏
  • 关注/订阅

C++11右值引用和move语义

最近面试被问到这个没答上来,在此整理一下右值引用在C++11当中又一个概念叫做右值引用,这个概念我们首先要能够进行区分左值和右值的概念,左值就是一个具体的内存对象,可以修改的,右值就是一个值,这个值可以赋值给其他的。右值引用的作用是让我们能够得到临时对象的所有权,这样我们就可以去修改临时对象了。int i = 50;int &a = i; //左值引用int &&ra = 42; /
原创
830阅读
0评论
2点赞
发布博客于 4 年前

HTTPweb服务器——代码实现

代码已托管github,有兴趣可以去看下,https://github.com/wsy081414/linux_practice/tree/master/http_servermain.c#include"httpd.h"static void *accept_request(void * arg){ int sock = (int )arg; pthread_detach(pt
原创
1260阅读
0评论
2点赞
发布博客于 4 年前

HTTPweb服务器——HTTP整体设计框架

我们整个的项目采用B/S模式,通过浏览器发送HTTP的get方法和post方法,然后server进行响应,这样最终通过html看到我们所显示的最终的效果。 另外,为了支持并发,我们采用了多线程的结构。1、进行创建监听套接字和其他socket编程的模式是一样的,我们这里的第一步依然是首先创建监听套接字,创建的过程依然是,socket–>bind—>listen。这里在bind的时候采用sockadd
原创
2768阅读
0评论
2点赞
发布博客于 4 年前

HTTPweb服务器——HTTP基本知识

对于HTTP来说,我们不需要说太多,HTTP又叫做超文本传输协议,现如今利用最多的版本是1.1版本,HTTP的特点: C/S模式,B/S模式 简单快速:基于请求和响应,请求只需要传送请求方法和路径。 灵活:HTTP允许传输任意类型的数据对象。 无连接:这个无连接说的是应用层的,应用层无连接,下层使用TCP依然是面向连接的,无连接的含义是限制每一次连接只进行处理一个请求,服务器处理完客户的请求
原创
4040阅读
0评论
0点赞
发布博客于 4 年前

Shell总结(二)

第一篇我们学习了Shell当中的变量和符号,接下来我们来学习一下Shell当中的语法。语法无非是有几个点,条件判断,循环控制,以及面向过程最重要的一点——函数。1. test和[首先我们来看一下test和[,这两个是有关于条件测试的。test命令和[的作用是一样的,都是用来判断条件是否成立。而对于条件的描述,就需要我们在上一节所说的关系运算符等 运算符 说明 -eq 判断是否相等
原创
483阅读
0评论
0点赞
发布博客于 4 年前

Shell总结(一)

最近学习了脚本语言,Shell,是时候进行一下总结了,好了,不多说了。1. 前言Shell是对操作系统的操作,操作系统进行管理硬件,开发人员通过Shell来和操作系统交流,通过操作系统的命令和操作系统之上的库,以及一些暴露的系统调用进行交流。Shell是基于命令的语言,Shell脚本语言。Shell常常用来处理文本,包装一些命令,把Shell包装一些命令,直接调用脚本,直接进行处理一大批命令,最早S
原创
489阅读
0评论
0点赞
发布博客于 4 年前

关于shell当中的$()和` `以及eval

1.$()和` `今天我们来看一下再shell当中的几个问题,一个是$(),一个是` `。首先,我们需要明确这里这两个的用途,$()和都是用来做命令替换的。例如:echo pwdecho $(pwd)echo `pwd`从效果就可以看出$()和 ` ` 的作用了吧。它进行命令替换,执行pwd。操作上,这两者都可以达到相应的效果,但是,我们建议是哟个(),因为,反引号容易和单引号搞混。另外多层次的
原创
10887阅读
0评论
6点赞
发布博客于 4 年前

存储映射I/O(mmap函数)和共享内存

前言最近在一次电话面试的过程中,面试官问我相关的共享内存的知识,当时就认为是我在学习IPC进程间通信学习到的共享内存,所以就给面试官讲解了一下,然后,面试官说我是否知道在Linux下的存储映射I/O,当时我下意识的知道就是mmap函数,但是感觉自己对这两个理解还是不够深刻,所以,写一篇博客来记录一下。首先附上我的关于共享内存的链接,关于共享内存的大致内容我这里就不多提了。 http://blog.
原创
2267阅读
0评论
3点赞
发布博客于 4 年前

I/O多路复用比较(select,poll,epoll)

讲述完了三种I/O多路复用模型,我们现在需要进行一下比较。比较三种I/O多路复用关于他们的优缺点呢,前面三篇博客我都有所提及,这里我主要为了再次总结一下。  select和poll都只能工作在低效的LT(水平触发),这种方式下进行多次的循环处理时间的等待。而epoll是在高效的ET(边沿触发)模式下工作,这个模式下当有时间响应的时候,应用程序这个时候必须立即处理。并且epoll还支持EPOLLONE
原创
610阅读
0评论
0点赞
发布博客于 4 年前

I/O多路复用——epoll

说完了select和poll,那么必须要说一下epoll的。select和poll是UNIX当中的,epoll是Linux所特有的。和前面的思路一样,poll解决了select的缺点,所以epoll的出现也是为了最大化的提高多路复用的效率,解决poll的缺点。epoll介绍epoll的实现和select与poll的实现有很大的差异,epoll不像select和poll一样通过一个系统调用来完成任务,
原创
999阅读
0评论
3点赞
发布博客于 4 年前

I/O多路复用——poll

上一篇我们说了关于select的相关信息,我们可以看到select是有弊端的,所以为了解决select的弊端,UNIX又在后期提出了poll。select的弊端这里就不多说了,上一篇博客有提及。pollpoll和select类似,不过在一些方面改善了select的弊端。它也是在指定的时间进行轮询文件描述符,查看是否有就绪时间发生。和上次一样,我们先来看一下poll系统调用。 int poll(str
原创
1075阅读
0评论
1点赞
发布博客于 4 年前

I/O多路复用——select

接下来我们讨论3篇关于I/O多路复用的问题,首先我们来看下select,select是多路复用当中最早的一种I/O复用的最主要的功能就是让程序能够同时去监听多个文件描述符,这样程序的性能就能提高。select介绍我们先来看一下select的接口。 int select(int nfds, fd_set *readfds, fd_set *writefds,
原创
692阅读
1评论
3点赞
发布博客于 4 年前

面试当中的git问题

面试当中的git和svn的内容:git是分布式版本控制系统,SVN是集中式版本控制系统。问题1:reset 与 rebase, pull 与 fetch 的区别git reset 不修改commit相关的东西,只会去修改.git目录下的东西。git rebase 会试图修改你已经commit的东西,比如覆盖commit的历史等,但是不能使用rebase来修改已经push过的内容,容易出现兼容性问题。
原创
5712阅读
2评论
2点赞
发布博客于 4 年前

Shell当中的字符串切割

我们来看一下以下这几种字符串切割的方式。1.使用 # 和 ## 来进行截取。val=“hello world!”echo ${val#*o}echo ${val##*o}进行字符串截取, 第一个是从左到右进行删除第一个o的字符串。 第二个是从左到右进行删除最后一个o的字符串。 这里的 * 表示的是通配符所以输出是: 使用%和%%进行截取 第一个介绍了从左到右进行截取,下面我们就进行介绍一下
原创
12770阅读
1评论
2点赞
发布博客于 4 年前

网络数据包传送的过程和DNS过程

网络数据包传送的过程在整个数据报传输过程当中,发送: 发送端进程首先调用系统调用,然后把数据发送给了socket,然后socket检查数据类型,调用系统调用send函数,send函数检查socket的状态,协议类型,传给了传输层,传输层对应的协议(UDP或者是TCP为这些数据创建数据结构),然后加入对应的传输层协议头部,然后交付给网际层,IP层,IP层加上它的头部,例如ip地址和检验和。然
原创
2927阅读
0评论
1点赞
发布博客于 4 年前

TCP

关于TCP协议是网络中很重要的一个协议,这个协议自然需要好好看看。我们从TCP的首部来一点一滴的深入理解这个协议。1. TCP首部介绍首先介绍首部字段:源端口和目的端口: 提供复用和分用,应用层的进程都可以通过传输层再传输到IP层,这就是复用,分用就是传输层从IP层收到数据后必须交付给指明的应用层应用进程。序号: TCP为传送的字节流每一个字节进行按照顺序编号,序号是本报文段的第一个字节编号,序号和
原创
851阅读
0评论
3点赞
发布博客于 4 年前

关于路由相关

路由:数据包从源地址到目的地址所需要经过的路径,由一系列节点组成。 路由节点:一个具有路由功能的主机或者路由器,维护一张路由表,通过查询路由表来决定向那个姐发送数据包。 路由表:由很多路由条目组成,每个条目都指明去往某个网络的数据包应该经由哪个接收和发送,其中最后一个是缺省路由条目。 路由条目:路由表中的每一行,每个条目主要由网络地址、子网掩码、下一跳地址、发送接收四部分组成,如果要发送的数据
原创
632阅读
0评论
1点赞
发布博客于 4 年前

ARP协议

ARP关于ARP地址解析协议,是我们通过IP地址可以获得MAC地址的一个协议,当我们在一个局域网进行通信的时候,所需要的条件就是必须有发送端和目的端两端的MAC地址。ARP协议的目的就是为了解决在局域网进行通信的时候只知道IP地址却不知道MAC地址的情况。我们先来看一下MAC帧: 从这个图中我们就可以看到MAC帧的具体的内容,所以我们在进行通信的时候当然必须要知道一个地址,就是目的地址,但是,在实
原创
691阅读
0评论
4点赞
发布博客于 4 年前

gdb调试多线程多进程

今天进行学习一下关于gdb调试多线程和多进程的情况:gdb调试多进程尝试来调试多进程的程序,我们使用gdb进行调试程序,gdb的调试默认是调试父进程的,但是为了做到可以对父进程和子进程都做到调试,所以附加了调试子进程的功能。我们可以对fork出来的进程进行设置调试方法。follow-fork-mode的用法为:set follow-fork-mode parent/child如果你选择了parent
原创
1485阅读
0评论
7点赞
发布博客于 4 年前

进程间关系

说完了进程,我们来说一下进程间关系。进程组一个或者多个进程的集合,每一个进程除了有一个进程ID之外,它还属于一个进程组。通常来说,进程组和作业相关联,可以来接收同一个终端下的各种信号,每一个进程组也有对应的唯一进程组ID。 这一列PGID就是进程组,我们可以看到上面那三个mydaemon的守护进程所在不同进程组。这里下面的带[]的都是内核进程,可以看到它们都在同一进程组。组长进程:组长进程就是
原创
1493阅读
0评论
6点赞
发布博客于 4 年前

数据链路层的三个问题

今天学习了关于数据链路层的知识,数据链路层使用的信道主要有以下的两种类型: 1. 点对点信道。这种信道使用一对一的点对点信道方式。 2. 广播信道。这种信道使用一对多的广播通信方式,因此过程比较复杂。通常我们使用的更多的是点对点的信道,所以在这里我们需要了解一些相关的概念。点对点信道的数据链路层在进行通信的时步骤如下: 1. 节点A的数据链路层把网络层交下来的IP数据报添加首部和尾部封装成帧。
原创
4648阅读
6评论
1点赞
发布博客于 4 年前

linux定时任务(crond)

关于crondcrond是linux下的一个周期性的执行某种任务或者等待处理某些时间的一个守护进程,与windows下的计划任务类似,当安装完成操作后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。crond并且也是一个守护进程,类似于计划任务,crond进程会自动启动。 上图中我们可以看到1920c
原创
533阅读
0评论
0点赞
发布博客于 4 年前

守护进程

我们接下来说一下关于守护进程。守护进程也叫做精灵进程,是运行在后台的一种特殊的进程,它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。生存周期长,它们常常在系统引导装入的时候启动,仅仅在系统关闭的时候才终止。因为它们没有控制终端,所以说它们是在后台运行的。很多服务器的应用都和守护进程相关。守护进程的特征:通常来说,我们需要知道,对于当我们开机以后首先操作系统首先通过0号进程去进行操作
原创
896阅读
1评论
1点赞
发布博客于 4 年前

linux学习——信号

信号标签(空格分隔): 未分类今天我们来说一说信号,linux当中有一个头文件signal.h其中提供了62个信号。信号是用于向一个进程来通知发生一部时间的机制。信号类似于一个硬件终端,但是信号没有优先级,操作系统看待信号都是平等的。对一个进程,一次只能给一个信号。所以信号我们也叫做软中断信号,通知进程发生异步时间,使用信号我们可以通过上述的信号,1-31我们叫做普通信号,34-64我们叫做实时信号
原创
852阅读
1评论
3点赞
发布博客于 4 年前

多线程编程(1)

线程概念线程线程就是进程的若干个执行流,因为一个进程在某一时刻只能去做一件事情,有了线程之后,我们可以在同一时间去做不同的事情,比如我正在边利用cmd markdown写博客。边用网易云音乐听音乐,这样多线程的情况下,能给我们带来很多好处。 在系统内核中其实是不存在线程的,linux使用进程模拟线程,线程的实现其实就是多个共享数据代码等信息的进程。所以我们把线程也叫做轻量级进程。进程常常用来分配资源
原创
831阅读
0评论
1点赞
发布博客于 4 年前

进程间通信——消息队列

前言进程间需要进程通信进行数据传输和资源共享,另外一个进程在很多时候需要向另外的一个进程通知事件,有时候进程之间存在关系,需要去控制另外的一个进程,所以进程通信是很需要的。进程间通信的第一种就是消息队列什么是消息队列消息队列是消息的链表,存放在内核当中,由消息队列标识符标识,消息队列提供一种进程之间数据块传送的方法,每个数据块都被认为是一种类型。每个进程都有一个与之相关联的消息队列,其功能就类似于一
原创
997阅读
2评论
3点赞
发布博客于 4 年前

进程间通信——共享内存

前言进程间IPC通信的三大主题,消息队列,信号量,共享内存,我们接下来说一说共享内存,共享内存可以提供给服务器进程和客户进程之间进行通信,不需要进行数据的复制,所以速度最快,只需要让两个进程通过页表映射到同一块物理内存即可,这样,这块物理内存是两个进程都能看到的,这样当一个进程进行写操作,另外的一个进程也就可以做读操作。所以问题关键也就是给出一个特定的存储区。通常情况下,我们需要确保一个进程在写的时
原创
1671阅读
4评论
6点赞
发布博客于 4 年前

静态库和动态库

前言在平时,我们很少关注于编译和链接的过程,在现在IDE遍布的天下,IDE为我们考虑好了一切。但是真正的藏在每个程序运行背后的东西,很多系统软件背后的运行机制都是需要我们去熟悉的,熟悉了这些,我们才能快速的解决一些相关的性能等问题。大家应该都知道对于链接来说,应用程序有两种的链接方式,一种就是静态链接,一种是动态链接。对于链接,链接的主要内容就是把各个模块之间相互引用的部分都处理好,是的各个模块之家
原创
414阅读
0评论
0点赞
发布博客于 4 年前

进程间通信--信号量

对于信号量来说,是IPC机构当中的一个,与消息队列等不同,它是一个计数器,用于为多个进程提供对共享数据对象的访问,接下来,我们对信号量进行一些探索。在这我们需要提出一些概念: 临界区:指的是访问临界资源的程序代码片段。临界区只能允许一个进程进入。 临界资源:临界资源说的是一次只能提供一个进程使用的资源。 互斥:互斥是指某一个资源同时只允许一个访问者对其进行访问。 原子性:一个事务包含多个操作
原创
666阅读
0评论
1点赞
发布博客于 4 年前

技术之瞳 阿里巴巴技术笔试心得 高清完整.pdf版下载

从别处花钱买来
pdf
发布资源于 4 年前

文件描述符和文件指针的区别

1.什么是文件描述符?文件描述符是计算机科学中的一个术语,是一个用于表述只想文件的引用的抽象化概念。在linux当中,每个进程会在进程控制块(PCB)当中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表都有一个指向已经打开文件的指针。每个linux进程都应该有三个标准的文件描述符,对应三个标准流。 整数值 名称 (unistd.h)符号常量 (stdio.h)文件流 0
原创
1574阅读
0评论
0点赞
发布博客于 4 年前

进程调度算法

今天我们来谈一谈进程调度算法:1. 先来先服务调度算法(FCFS)先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为
原创
674阅读
0评论
2点赞
发布博客于 4 年前

进程—内存描述符(mm_struct)

前言上一篇我们谈论了task_struct这个结构体,它被叫做进程描述符,内部成员包含了很多与进程相关的信息,今天我们来看一下其中一个被叫做内存描述符的结构体——mm_struct,抽象的来描述linux下进程的地址空间的所有的信息。1.概述一个进程的虚拟地址空间主要由两个数据结来描述。一个是最高层次的:mm_struct,一个是较高层次的:vm_area_structs。最高层次的mm_struc
原创
17115阅读
0评论
24点赞
发布博客于 4 年前

进程管理—进程描述符(task_struct)

前言当把一个程序加载到内存当中,此时,这个时候就有了进程,关于进程,有一个相关的叫做进程控制块(PCB),这个是系统为了方便进行管理进程所设置的一个数据结构,通过PCB,就可以记录进程的特征以及一些信息。 内核当中使用进程描述符task_struct。 这个task_struct就是一个定义的一个结构体,通过这个结构体,可以对进程的所有的相关的信息进行维护,对进程进行管理。接下来我们需要对tas
原创
1851阅读
0评论
2点赞
发布博客于 4 年前

linux中关于压缩的命令

1.前言最近在linux下安装东西,发现好多安装都需要通过使用压缩指令来完成,所以觉得是时候来总结一下了。在windows下,我们常见的压缩格式有两种,zip和rar。在讲述压缩指令之前,我们先去看两个概念,打包和压缩。这个很好理解,打包,就是把零散的东西包装起来成一个总文件,压缩呢,就是把一个大文件压成小文件。这两个概念是必须要清楚的,对于linux来说,后续很多命令存在在这个概念的区别。首先,我
原创
3419阅读
0评论
2点赞
发布博客于 4 年前

从一个进度条看问题

1.前言我们要实现关于一个进度条,我们的想法是采用for循环的方式,所以对于这个进度条,我们需要从下面几个问题来一一看待问题。2.关于 ‘
’ 与 ‘\r’这两个符号,一个叫做回车,一个叫做换行,好多人对这两个分不清,所以我们在这里需要介绍一下。 在最早的时候,只有打字机的时候,人们在每行的后面加上两个表示结束的字符,一个叫做回车,它把打字机的光标定位在左边界,另外一个是换行,它用来换到下一行,
原创
3185阅读
0评论
4点赞
发布博客于 5 年前

初识linux下的find命令

1.认识find命令关于find命令,本人认为是linux当中所有的命令当中最重要的一个命令之一,所以,在这里,我们来聊一聊find命令。find命令用于在目录下查找文件,find是在磁盘上进行查找,所以相对来说,效率会低一些。首先,给出find命令所有的参数 -amin<分钟>:查找在指定时间存取过的文件或者目录,单位以分钟计算。 上述就显示了我15分钟内存取过的文件或者目录,这里说的是被访问
原创
767阅读
0评论
0点赞
发布博客于 5 年前

初识linux下的三个时间

1.从命令看时间在linux下,我们可以去查看一个文件的三个时间,比如:对于test.c文件我们可以查看时间,使用命令 stat查看stat test.c在这里我们得到以下信息。 通过上述信息,我们可以看到有许多信息,接下来,对于这三个时间,我们进行一番讲解。2.深入理解三个时间atime(Access time):当我们去访问这个文件,这个时间会被改变,时间就是最后一次我们访问的时间,例如
原创
2172阅读
0评论
3点赞
发布博客于 5 年前

初识linux软链接和硬链接

1.从文件开始到软硬链接在认识软链接和硬链接之前,我们先来了解一下整个系统当中的文件存放特点,在linux当中,数据分为元数据和用户数据,元数据包括文件的一些属性,例如文件大小,创建时间等一些内容。元数据当中有一个叫做inode(它是元数据的一部分,可以叫做索引节点号),inode作为文件的唯一标识。而文件名,是为了方便记忆。linux系统通过inode来查找正确的数据块,获取对应的信息,而对于用户
原创
1927阅读
3评论
7点赞
发布博客于 5 年前

面试题——快排挖坑法的应用

对一个数组按照给定的下标进行排序,仅仅使用两两交换的方式,要求不能对数组进行扩容,尽可能少的额外空间。 如:原数组为A,B,C,D,E,现在给定的新位置为3,0,1,4,2,那么排序后为D,A,B,E,C, void SwapSort(int *pArr,int *pPos,int n)1.解决问题这是最近看到的一道面试题,感觉突然一下不容易想到,所以特此来写一下:实现代码:
原创
1981阅读
1评论
1点赞
发布博客于 5 年前

STL剖析——空间配置器

近来闲来无趣,看了下STL的空间配置器。首先恭喜我入坑,网上无数的人都在剖析这STL的空间配置器,所以,刚好,今天我也加入了这个团队,这个应该是我目前看到的比较完整架构的一个源码了吧,希望能提示我的水平,毕竟设计的很好。在这里特别说下,没有操作系统的知识,所以在这里的线程和锁的这些问题,我们一概不讨论STL的空间配置器,就是一个为了给容器进行分配内存和管理内存的东西,容许我盗几张图给大家说明。 这
原创
792阅读
0评论
3点赞
发布博客于 5 年前

回忆智能指针

今天去回想了一下智能指针,发现长时间不用,好多知识点都忘记了,所以在这里写一篇博客记录一下。C++当中没有自动内存回收机制,这样每次new出来的内存都需要我们手动的去delete,这样就会存在忘记的可能性,最终造成内存的泄漏。,所以为了解决这个问题,C++引入了智能指针。std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::scoped_a
原创
367阅读
0评论
0点赞
发布博客于 5 年前

内存池——实现一个简单的固定大小的内存池

最近在STL当中看到了第二级内存分配器,这里有个内存池的内容,在这在知乎上看到了内存池的相关内容,所以萌生了一个想自己写一个简单的内存池的想法。这种简单的内存池,援引自知乎的: 实现固定内存分配器: 即实现一个 FreeList,每个 FreeList 用于分配固定大小的内存块,比如用于分配 32字节对象的固定内存分配器,之类的。每个固定内存分配器里面有两个链表,OpenList 用于存储
原创
3595阅读
1评论
7点赞
发布博客于 5 年前

二叉树——面试题

1.求二叉树中最远的两个节点的距离在这我们首先来分析思路,对于最远的两个节点,在这会有两种情况。1)如果root为NULL,那么这是一颗空树。空树的最远子节点距离和高度均为零。 2),如果root非空,最大距离要么是左子树中的最大距离,要么是右子树中的最大距离,要么是左子树节点中到根节点的最大距离+右子树节点中到根节点的最大距离,同时记录左子树和右子树节点中到根节点的最大距离。 示例代码://求
原创
1136阅读
0评论
7点赞
发布博客于 5 年前

归并法外排序—海量数据排序

1.外归并排序讲完了内排序,我们来了解一下,外归并排序,外归并排序一般是应对于数据量非常大的数据,这些数据放在硬盘上,无法一次性的放到内存上。所以,我们通常采用的思路对于这些数据就是进行切分,然后对切分出来的文件进行排序。在排序的时候,小文件我们采用快排来排序,如果是大文件,我们就从两个文件中一个一个读取,然后进行归并排序,放入合并以后的文件当中,最后最大的文件就是排序以后的结果。外排序是指在排序期
原创
2793阅读
1评论
1点赞
发布博客于 5 年前

从一道小米面试题看并查集

首先,我们从一道题来引出这个问题。假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友…),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。假如:n = 5,m = 3,r = {{1 , 2} , {2 , 3} , {4 , 5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友,则1、2、3属于一个朋友圈,4、5属于另一个朋
原创
1417阅读
1评论
0点赞
发布博客于 5 年前

非比较排序—计数排序和基数排序

讲述完了比较排序以后,我们来看一下非比较排序。1.计数排序实现计数排序是一种稳定的排序算法,计数排序实现简单。它算法的步骤是:1)首先找出序列当中的最大和最小的数,然后通过这两个数确定一个范围,这样就可以直接建立一个范围这么大的哈希表。 2)把数对应哈希表的下标,统计次数。 3)通过哈希表,从小到大进行遍历,然后按哈希表顺序写入序列当中。 示例代码:#pragma once#define _C
原创
559阅读
0评论
0点赞
发布博客于 5 年前

分析归并排序

对于归并排序而言,我们应该需要关注一下思想,归并也是一种分治的思想,类似与快速排序,但是又和快速排序有本质的区别。归并排序归并排序将要排序的序列分成两个长度相等的子序列,然后对每一个子序列进行拆分,一直到只有两个元素的两个子序列,对这两个子序列进行归并,将它们合并成一个序列,这种方法就是所说的二路归并的方法。实现归并排序的思路: 所以,综合下来,我们实现代码://递归解决归并排序templat
原创
708阅读
0评论
0点赞
发布博客于 5 年前

选择排序及其优化

选择排序是八大内部排序方法中的一种,选择排序的整体的思想就是,我们在一个序列当中选出一个最大的(升序为最小的),然后和第一个元素交换,然后后面再在剩下的找最大的,再和第二个元素交换。这样最终就可以得到一个有序的序列。我们最先接触的就是这种写法。//Cpp版本template<typename T>void SelectSort(T* arr,int n){ int max = 0;
原创
6999阅读
3评论
0点赞
发布博客于 5 年前

快速排序及其优化

我们今天来研究下快速排序,快速排序的一个整体的思想就是分治的思想,在这个过程当中,首先对一个大区间进行单趟快速排序,然后把大区间分成多个区间,再去进行单趟排序,一直到这个区间中的元素只剩下一个元素,这样重复以后就可以得到最后的排序后的结果。 1.单趟排序分析快速排序的最重要的就是单趟排序,接下来就是进行分治的单趟排序,所以我们来重点说一下单趟排序。我们在这里介绍关于快速排序的单趟排序的三种方法。左
原创
2308阅读
1评论
7点赞
发布博客于 5 年前

求问虚拟机安装centos问题

在虚拟机上安装centos,出现这个问题,怎么解决?![图片说明](https://img-ask.csdn.net/upload/201611/23/1479871909_572197.png)
1回答
发布问题于 5 年前

从直接插入排序到希尔排序

希尔排序需要和直接插入排序我们来联合起来进行比较。1.直接插入排序首先我们来看直接插入排序: 直接插入排序就是一个将无序区的内容向有序区放的一个过程,有序区不断地变大,无序区不断的变小,这样最后全部变为有序,就完成了直接插入排序的过程了。算法步骤:1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。2)从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序
原创
949阅读
0评论
3点赞
发布博客于 5 年前

浅析——B树,B+树,B*树以及分析MySQL的两种引擎

接触到了数据结构当中的B树,B+树,B*树,我觉得应该写一篇博客记录下,毕竟是第一次接触的,只有写了博客以后,感觉对这个的印象才会更加深刻。 前言: 为什么要有B树? 学习任何一个东西我们都要知道为什么要有它,B树也一样,既然存储数据,我们为什么不用红黑树呢?这个要从几个方面来说了, 计算机有一个局部性原理,就是说,当一个数据被用到时,其附近的数据也通常会马上被使用。 所以当你用红黑树的时
原创
16941阅读
4评论
20点赞
发布博客于 5 年前

如何解决哈希表的拉链法的缺点?

也就是拉链特别长的时候,有什么好办法能够解决的吗?主要是为了解决查询的效率问题,我想过把拉链变为一棵红黑树,除了这个办法以外还有什么好办法吗?
2回答
发布问题于 5 年前

初识STL——set,multiset,map,multimap

最近在学习STL,在前期分析了vector和list的源码,印象很深,感觉对自己以后的代码之路产生了很多改变,今天,介绍下STL当中的几个关联式容器。本博客所有论述的都为SGI版本的STL。1.什么是关联式容器关联容器是通过键存取和读取元素、顺序容器通过元素在容器中的位置顺序存储和访问元素。因此,关联容器不提供front、push_front、pop_front、back、push_back以及po
原创
1220阅读
0评论
2点赞
发布博客于 5 年前

海量数据分析问题总结

1)给⼀个超过100G⼤⼩的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?第一题:首先我们的思路就是利用哈希进行文件的切分,我们把100G大小的logfile分为1000份,那么下来差不多没一个文件就是100M左右,然后再利用哈希函数除留余数的方法分配到对应的编号文件中,然后得出每个文件中出现次数最多的IP,然后堆排序取得这1000个ip中出现次数最多的。2)与上题
原创
1628阅读
1评论
7点赞
发布博客于 5 年前

哈希拓展——布隆过滤器

哈希表的另外一个应用是布隆过滤器。1.什么是布隆过滤器关于布隆过滤器,我们需要讲很多关于它的东西,首先我们可以知道这个东西是个叫做布隆的人发现的,它一般用于解决网络爬虫重复问题,还有比如防垃圾邮件或垃圾网页的实现,都可以利用它。布隆过滤器也是针对的是哈希冲突,可以通过一个Hash函数将一个元素映射成一个位阵列(Bit Array)中的一个点。这样一来,我们只要看看这个点是不是 1 就知道可以集合中有
原创
1129阅读
0评论
1点赞
发布博客于 5 年前

哈希的拓展——位图

关于哈希表,我们需要拓展一些知识,在这有一个位图需要我们理解。首先我们来看一道腾讯的题。 给4 0 亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这4 0 亿个数中。这道题我们怎么做呢?这是一道关于海量数据查找的题,其实这道题,我们就可以和哈希表联系在一起,为何说是海量数据呢,对于一个40亿整数,我们如果要存的话,按照无符号整数来存储,那么下来,大概就需要40亿*4这
原创
1520阅读
0评论
4点赞
发布博客于 5 年前

关于哈希表

学习完了有关二叉树的搜索结构,今天我们来接触另外一种结构,叫做哈希表。1.什么是哈希表哈希表:是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。它的所保存的数据和位置会有一种关系,这种关系我们叫做哈希函数。2.构建哈希表的方法常用的构建哈希表的方法有5种。这5种方法分别是: 构建哈希表的方法有: 1)直接定址法
原创
835阅读
0评论
5点赞
发布博客于 5 年前

浅析红黑树(一)

1.了解红黑树学习完AVL树,开始了红黑树的学习,关于红黑树,和AVL树是类似的,都是会在我们进行插入操作或者删除操作以后会进行一些操作,来使得整个二叉树保持一个平衡。红黑树和AVL树的区别在于一个是依照平衡因子来维持整个树,而红黑树是利用颜色来限定平衡。 自从红黑树出现以后,AVL树就慢慢消失了,原因,会在后面讲解。另外,最为重要的是在STL当中,有很多都应用了红黑树,比如:set, multis
原创
1854阅读
0评论
2点赞
发布博客于 5 年前

浅析AVL树

1.为什么提出AVL树学习完搜索二叉树以后,我们应该想到一个问题,如果我们的搜索二叉树的趋向于单链的形式,类似于: 这两种情况随之而来的是时间复杂度太高,当我们在这两种当中搜索,时间复杂度为O(N),所以这样效率大大下降了!2.二叉平衡树概念和结构为了解决上述问题,所以提出了一个概念,叫做二叉平衡树。二叉平衡树,相对于二叉搜索树,引入了一个叫做平衡因子的概念。 平衡因子:平衡因子就是右子树的
原创
2067阅读
0评论
4点赞
发布博客于 5 年前

剑指offer—关于判断二叉树是否为平衡二叉树

判断一颗二叉树是否为平衡二叉树,当这到面试题摆在我们眼前的时候,我们需要进行思考,二叉树满足平衡二叉树的条件是什么,就是对于每一个节点,它的右子树深度减去左子树的深度的绝对值必须是小于2才行。对于这个深度差,我们也叫做平衡因子。所以,根据上面的条件,我们可以进行一种最简单的思路,就是我们首先可以对每一个节点进行遍历,然后看它的平衡因子进行比较判断,看它是不是合法。 bool _IsAVLBin
原创
11062阅读
0评论
7点赞
发布博客于 5 年前

搜索二叉树

二叉搜索树:它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉搜索树有个特点,最左的是最小的节点,最右的是最大的节点。 当我们把二叉搜索树进行中序遍历的时候,它是进行排序后的结果,所以我们也把二叉搜索树叫做排序二叉树。接下来我们介绍二叉
原创
1536阅读
0评论
1点赞
发布博客于 5 年前

堆&&堆排序&&N个数中找出K个最大值&&优先级队列

学习二叉树后,有一个东西需要我们来关注下,就是堆,对于堆,来说我们可以把堆看作一颗完全二叉树。这里我们也可以叫做二叉堆。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。另外,需要关注的就是有一个大堆和一个小堆。 大堆就是父节点的数值大于任何一个子节点的数值。 小堆就是父节点的数值小于任何一个子
原创
2876阅读
0评论
3点赞
发布博客于 5 年前

线索化二叉树

关于二叉树的线索化的问题,是为了解决平时的节点中空的指针域,所以在这里我们引入了线索化二叉树。利用一些节点当中空的指针域。线索化二叉树的思想是需要一个prev指针来记住前驱,然后通过对cur节点的维护和prev指针分别进行维护。#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<cstdlib>using namespace st
原创
1054阅读
0评论
1点赞
发布博客于 5 年前

二叉树的非递归的实现

二叉树的非递归的实现,其实就是实现二叉树递归的思想,二叉树的递归实现压栈,然后递归,在这里,是通过数据结构栈来实现。1.非递归前序遍历因为二叉树前序遍历是先访问根节点,在访问左节点,再是右节点,所以我们在这里首先循环到最左节点,并且在这个过程中,输出访问的节点,并且把节点入栈,这样就到最左边的节点,然后看最左边节点的左子树,这时为NULL,然后取出栈顶元素。这个时候就回到最左边的节点,然后访问它的右
原创
917阅读
0评论
2点赞
发布博客于 5 年前

简单实现二叉树

简单的实现一个二叉树所需要的基本要求,后续进行其他的更新。二叉树最重要的是递归的思想,在这里我想请你去参考我上一篇的广义表,那个思想比起二叉树来说更加简单一些。#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<cstdlib>#include<cassert>#include<queue>using namespace s
原创
1028阅读
0评论
1点赞
发布博客于 5 年前

广义表的实现

广义表:广义表(Lists,又称列表)是一种非线性的数据结构,是线性表的一种推广。即广义表中放松对表元素的原子限制,容许它们具有其自身结构。毫无疑问,广义表是一种线性表的推广,也有人叫做列表。广义表存储结构广义表中的元素是可以具有不同结构的,所以难以用顺序结构来表示,通常都采用链式的存储结构。在这个结构中我们共有三种类型的节点,一种保存正常值的,一种是头节点,一种是子表节点。 在这里我们来看看下
原创
1607阅读
0评论
3点赞
发布博客于 5 年前

关于对称矩阵和稀疏矩阵问题的探究

今天我们来探讨下对称矩阵和稀疏矩阵的问题。 为什么要探讨这个问题呢,其实主要是为了他们的一些性质我们可以善加利用。1.对称矩阵对称矩阵:关于对称矩阵,元素以主对角线为对称轴对应相等的矩阵。 例如所以综合以上特点,我们就可以来想办法保存这个对称的矩阵,因为上面这个矩阵的上半部分和下半部分是一样的,所以在这里我们只需要保存一半,然后我们将对角线也进行保存就好了,所以,在这里,我们所以思路就是我们先对
原创
1991阅读
0评论
1点赞
发布博客于 5 年前

关于队列和栈的几道面试题

关于队列和栈的几道面试题今天来说几道简单的栈和队列相关的几道面试题:1 . 实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O (1 )第一道题,我们需要分析,我想一般的思维肯定是想到,开辟一块空间,进行保存最小值,这种方法也是大家通常地一下就可以想到的。但是在这里会有一个问题,就是如果你的最小值在栈顶,当你pop了栈顶以后,下面的数据中最小的元素就
原创
2271阅读
2评论
0点赞
发布博客于 5 年前

C语言实现封装,继承

1.C语言实现封装在C语言当中,是不存在封装这一个特性的,我们要实现它,我们可以借助两个方法:1.利用C语言中的头文件,在头文件中进行声明,在C文件中对它进行定义,这样就可以隐藏内部信息,用户只能看到接口和公开的信息,无法知道对象所占内存等。 示例代码:头文件:#define _CRT_SECURE_NO_WARNINGS 1//在这里,头文件中给出了声明,用户只能看到公有部分和函数接口。#i
原创
9081阅读
0评论
7点赞
发布博客于 5 年前

逆波兰表达式求值

逆波兰表达式:也被称作后缀表达式,在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示。而逆波兰表达式,它的每个运算符总是和它前面的两个运算数进行结合。接下来我们来探讨一下逆波兰表达式求值的问题。1.确定保存形式在这里,我们利用枚举常量巧妙地来通用所有的元素。enum Type{ OP_SYMBOL, OP_NUMBER, ADD,
原创
1498阅读
0评论
0点赞
发布博客于 5 年前

回溯法解决迷宫问题

迷宫问题,是一个非常经典的问题,我们通过栈这种数据结构来解决这个问题。1.设计思路我们这里采用回溯法解决迷宫问题,即从入口出发,顺某一方向试探,若能走通,则继续往前走,否则原路返回,换另一个方向继续试探,直至走出去为止。2.剖析实例例如,我们给定下面这样的迷宫:1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 10 0 0 1 1 1 1 1 1 11 1 0 1 1
原创
6137阅读
1评论
2点赞
发布博客于 5 年前

C++之类型萃取技巧

在我们前面写顺序表的时候会产生一个问题。使用类型萃取的原因就是当你的顺序表是自定义类型,我们进行顺序表增容的时候,这个时候会出现一个问题,比如string类型,这个类型中有一个_buf与_ptr,当储存少于16个的时候这时会储存在_buf当中的,如果多于16个,那个会单独开辟空间,进行储存,这时拷贝的时候就是拷贝过去这个储存的地址而已,所以这样调用析构函数的时候,当增加容量的时候,这个时候会把储存s
原创
955阅读
0评论
3点赞
发布博客于 5 年前

模板模拟实现stack和queue

在这里我们接下来实现两个数据结构,一个是stack,一个是queuestack和queue数据特性?毫无疑问,我想每一个学过数据结构的人都可以脱口而出,栈的数据特性采用的是先进后出,而队列采用的时候先进先出。 stack和queue采用什么类型的数据结构?我们来这样思考,对于栈来说,我们最多需要操作的是栈顶,如果我们采用链式的方式,就需要从头一直遍历到尾部,然后才能再次进行维护。而如果我们采用
原创
1063阅读
0评论
5点赞
发布博客于 5 年前

python入门学习(二)

python中提供了许多数据类型让我们来使用,接下来简单的来介绍几个1.listPython内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。list=['haha','hehe']用len()函数可以获得list元素的个数 len(list名)list类似于数组,可以进行索引list[-1]这个就是最后一个元素,以此类推,-2,-3 当然可以给lis
原创
386阅读
0评论
0点赞
发布博客于 5 年前

python入门学习(一)

这几天开始了python的自学环节,既然都学了,不来写一写博客心里面还是觉得不是太舒服。python的变量定义python中的变量定义非常简单,可以直接定义就可以了。a=10b=50c=a+bprint(c)python就是这么方便,的确是简单,易用啊。python的判断语句python的判断语句使用也是非常简单num =20if num%2==0: print("num是偶数")
原创
420阅读
0评论
0点赞
发布博客于 5 年前

C++知识点部分总结

把最近C++的知识点做了一下总结,有需要的,有问题的,可以发邮件到953659912@qq.com。本人水平有限,难免会出现一些错误,希望大家如有发现,能够及时指出纠正
原创
572阅读
0评论
1点赞
发布博客于 5 年前

利用仿函数实现定制删除器

1.仿函数首先我们需要知道什么是仿函数。 仿函数:仿函数(functor),就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。 示例:#include<iostream>#include<cstdlib>using namespace std;class Print{public: void opera
原创
486阅读
0评论
0点赞
发布博客于 5 年前

shared_ptr循环引用问题

我们大家都知道shared_ptr是采用引用计数的方式进行。但是它存在一个问题:#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<cstdlib>#include<boost/shared_ptr.hpp>using namespace std;struct Node{ ~Node() { co
原创
3490阅读
0评论
2点赞
发布博客于 5 年前

python开发环境搭建

python集成开发环境的搭建首先,我们需要上到网站www.python.org,在这里面我们可以下载想要的版本,windows,linux等都有。一般python大家都用的是2.7版本,所以在这里推荐2.7的版本。 然后接下来我们需要去http://www.jetbrains.com/下载IDE pycharm把两个文件最后全部安装就好了。python下的hello world首先打开桌面安
原创
399阅读
0评论
2点赞
发布博客于 5 年前

C++当中的几种强制类型转换

在C++当中,我们不推荐继续使用C类型的强制转化,而是使用标准C++的类型转换符,标准C++中有四个类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。下面对它们一一进行介绍。static_cast只要是不包含底层的const,我们都可以使用static_cast,当需要一个较大的算数类型赋值给较小的类型的时候,这个时候static
原创
627阅读
0评论
0点赞
发布博客于 5 年前

C++模板实现链表,顺序表

Seqlist.h#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<string>#include<cassert>using namespace std;template<typename T>class SeqList{public: SeqList(); ~SeqList(); SeqLis
原创
1024阅读
1评论
2点赞
发布博客于 5 年前

浅析C++当中的对象模型

我们来分析一下C++当中的对象模型。什么是虚函数表?C++的对象模型,我们首先需要分析的是虚函数表。 虚函数,这里我们就要牵扯到多态。简单的说就是父类指针或者引用调用重写的虚函数,当指向父类的时候,调用父类的虚函数,当指向子类的时候,这时候会调用子类的虚函数。首先,我们在这里需要了解一个概念,虚函数表。虚函数呢,就是通过虚函数表来实现的,在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、
原创
877阅读
0评论
2点赞
发布博客于 5 年前

模拟string的Copy-On-Write

Copy-On-Write的原理:Copy-On-Write一定使用了“引用计数”,是的,必然有一个变量类似于RefCnt。当第一个类构造时,string的构造函数会根据传入的参数从堆上分配内存,当有其它类需要这块内存时,这个计数为自动累加,当有类析构时,这个计数会减一,直到最后一个类析构时,此时的RefCnt为1或是0,此时,程序才会真正的Free这块从堆上分配的内存。这个RefCnt该存在在哪里
原创
636阅读
0评论
1点赞
发布博客于 5 年前

C++string类的实现

面试的时候我们可能会经常碰到这个问题,所以我们需要复习一下这个问题。由于时间要求,我们不可能写出std::string那样的功能,我们需要能够大体实现相关功能.#include<iostream>#include<cstdlib>using namespace std;class String{ friend ostream& operator<<(ostream& os,String
原创
1650阅读
0评论
1点赞
发布博客于 5 年前

C++引用

引用是C++当中的一个概念。 引用,引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。 引用的声明方法:类型标识符 &引用名=目标变量名;左值引用首先说下左值和右值的概念。 右值是放在寄存器,cpu当中的 。 左值必须在内存当中存在实体。左值引用,需要一个取&。示例:int main(){ int a (5); int &ra(a); ra
原创
1246阅读
0评论
2点赞
发布博客于 5 年前

函数重载和缺省参数

函数重载C++允许在同一作用域类声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算功能函数重载必须是参数的个数或者类型不同,与返回值无关。在C语言当中是不支持函数重载的,在c语言编译的时候是完全根据函数名进行编译的,而c++当中,函数进行重命名的时候,会给与C的重命名不一样,会加上参数的内容。 也就是调用的时候,会根据
原创
1506阅读
0评论
0点赞
发布博客于 5 年前

C++命名空间

好久没写博客了,现在也开始了C++的学习,最近一个半月非常颓废,没有好好编程,旧的结束,代表着新的开始,大三了,不可蹉跎岁月!!!今天我们首先从C++最基础的东西开始,大二第一个学期接触过C++,可惜当时学的真是云里雾里,现在自己一步步进行摸索,感觉好多都是恍然大悟的样子。多余的就不多说了,开始今天的学习。首先我们来讲下命名空间。命名空间对于命名空间,这是一个C中没有的东西,首先这里要提出一个问题,
原创
1047阅读
0评论
2点赞
发布博客于 5 年前

链表面试题总结(一)

基于上一次写的链表,现在,我们来讨论下面这些问题。1.链表的冒泡排序 2.删除无头非尾节点 3.反转链表 4.在当前节点前插入一个数据x 5.查找链表的中间节点。 6.删除单链表的倒数第K个节点(K>1&&K<总长度)对于上面这6个问题,我们进行分析与解答。链表的代码我都已经写过博客:数据结构—单链表的实现另外,我也在我的github上有链表的代码,github链接如还有什么问题,可以发邮
原创
10886阅读
1评论
7点赞
发布博客于 5 年前

链式队列的实现

今天实现以下链式的队列,首先,要清楚对列是什么: 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(head)进行删除操作,而在表的后端(tail)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。 所以总结一下队列就是后进前出的一种数据结构,在这里,我们首先来写出链队列的实现。linked_queue.h#define _CRT
原创
2547阅读
0评论
1点赞
发布博客于 5 年前

巧妙利用栈实现计算器

首先我们实现一个计算器,用户所输入的为中缀表达式,这是通用的算术公式的表达方法,但是有一个缺点就是不容易被计算机所理解。所以,有了所谓的后缀表达式! 后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 * 然后咱们通过栈来实现这个计算器的功能。 在这里中缀表达式转后缀表
原创
9522阅读
0评论
7点赞
发布博客于 5 年前

数据结构—单链表的实现

关于单链表,是最熟悉不过的一种数据结构了。今天,花费了很长的时间写出了单链表,和大家分享一下,有问题大家可以提出来!!!linklist.h#define _CRT_SECURE_NO_WARNINGS 1#ifndef __LINKLIST_H__#define __LINKLIST_H__#include<stdio.h>#include<stdlib.h>#include<assert
原创
3451阅读
1评论
1点赞
发布博客于 5 年前

排序算法总结(一)

今天,我们来总结一下排序算法: 排序分为冒泡排序,选择排序,插入排序,希尔排序,合并排序,快速排序,堆排序,基数排序等等,本篇文章我来详细解析冒泡排序,选择排序,直接插入排序。冒泡排序首先说说最简单的冒泡排序:从老谭那本书就开始认识冒泡排序了,这种方法简单易懂: 这张动图可以解释冒泡排序。 接下来,看代码的实现:#include<stdio.h>#include<stdlib.h>#i
原创
4844阅读
0评论
3点赞
发布博客于 5 年前

数据结构—动态顺序表的实现

前面我们实现了顺序表,但是我们应该会考虑到一个问题,顺序表一次性创建那么大空间造成的浪费很多,所以在这里,我们需要一个可以动态增长的顺序表来满足我们的需求!实现中需要注意的是:在这里我们要注意的是首先你应该给顺序表一个容量,当每次满了的时候,进行扩容!另外,在这里我分别使用了三种的排序算法:插入排序,选择排序,冒泡排序。dynamic_seqlist.h#define _CRT_SECURE_NO_
原创
3220阅读
0评论
1点赞
发布博客于 5 年前

剑指offer—字符串转换整数

对于这个问题,其实最先开始我是采用循环的方式进行的,int StrToInt(char *str){ int number=0; while(*str!=0) { number=number*10+*str-'0'; str++; } return number;}这是最初的一个想法,在我们遇到这个情况了以后,我们作为编程的
原创
3303阅读
0评论
1点赞
发布博客于 5 年前

数据结构—顺序表的实现

线性表的顺序存储又称为顺序表。它是用一组地址连续的存储单元,依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。第1个元素存储在线性表的起始位置,第i个元素的存储位置后面紧接着存储的是第i+1个元素。因此,顺序表的特点是表中元素的逻辑顺序与其物理顺序相同。所以在这里我们实现一下顺序表!seqlist.h#define _CRT_SECURE_NO_WARNINGS 1#if
原创
5180阅读
0评论
1点赞
发布博客于 5 年前

C语言小项目—注释转换

本次这个小项目的目的是把.c文件中的C风格的注释转换成为C++风格的注释。C注释风格:/**/ C++注释风格://首先我们分析一下会出现的几种状态,以及各种状态之间的转换关系: 首先我们在这里对一些状态进行了标注,我们这里已知的有4种状态, 第一种是END_STATE 第二种是C_STATE 第三种是CPP_STATE 第四种是我们平时的NULL_state。在这里,注释转换操作的是文
原创
3643阅读
0评论
3点赞
发布博客于 5 年前

C语言知识点总结

在这里对C语言利用思维导图的方式进行总结一下,写的不算太深,主要是能让大家知道复习时应该搞清楚的问题。思维导图后续仍然会补充,如果需要思维导图文件,请发邮件到953659912@qq.com
原创
8354阅读
5评论
5点赞
发布博客于 5 年前

剑指offer—左旋转字符串

题目:字符串的左旋转操作时把字符串前面的若干个字符转移到字符串尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串“abcdefg”和数字2,该函数将返回左旋转2位得到结果“cdefgab”对于这一道题,按照普通的思想我们的想法一般都是先把字符a取出来,然后把后面你的字符串向前移动,然后把a放到最后。然后依次再把b进行一次,就可以了。代码:#include<stdio.h>#includ
原创
4913阅读
0评论
2点赞
发布博客于 5 年前