自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【剑指offer】二叉搜索树的后序遍历序列

题目地址:https://www.nowcoder.com/practice/a861533d45854474ac791d90e447bafd?tpId=13&tqId=11176&tPage=2&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-rankin...

2020-02-09 16:47:21 188

原创 【剑指offer】链表中倒数第K个节点

输入一个链表,输出该链表中倒数第k个结点struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};class Solution {public: ListNode* FindKthToTail(ListNode* pListHead,...

2020-02-07 20:13:47 168

原创 ARP协议思维导图

最近在复习网络的知识,感觉画图逻辑更清晰一点

2019-09-17 13:35:21 570

原创 平衡二叉搜索树之AVL tree

什么是平衡二叉搜索树? 平衡二叉搜索树就是为了弥补二叉树的缺陷,避免深度过深导致查找效率降低。判定一个树是否是平衡树,没有一个绝对的标准,平衡的意思其实就是避免深度过深,但是不同的平衡条件,实现复杂度不同,查找效率也有一些差别。常见的平衡二 叉树有:AVL-tree RB-tree。它们都比一般的二叉搜索树复杂一些,所以插入,和删除节点的平均时间较长,但它们可以解决极端不平衡...

2019-08-08 20:45:13 245

原创 二叉搜索树

什么是二叉搜索树? 二叉搜索树又叫二叉排序树,空树是特殊的二叉搜索树。若左子树不为空,那么左子树节点上的值都小于根节点的值;若右子树不为空,那么右子树上所有节点的值都大于根节点的值;左右子树也是二叉搜索树。二叉搜索树的性能分析 对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数...

2019-08-08 18:31:31 332

原创 shared_ptr的循环引用问题

struct ListNode{ int _data; shared_ptr<ListNode> _prev; shared_ptr<ListNode> _next; ~ListNode(){ cout << "~ListNode()" << endl; }};int main(){ shared_p...

2019-08-06 12:19:26 312

原创 浅谈智能指针

1、为什么要使用智能指针? C++的内存管理是让很多人头疼的事,一不小心就会发生内存泄漏,重复释放,野指针等问题。大部分关于指针的问题都是来源于堆空间,为什么呢?我们知道栈上的空间是由系统维护的,申请和释放的工作都是由系统根据栈的性质来完成的,不需要我们过多干预。而堆上空间的申请(new)和释放(delete)都必须由程序员显示的调用,并且很重要的一点,这段空间的生命周期就在n...

2019-08-04 20:23:41 278

原创 C++三大特性之继承

继承的本质:代码复用(类级别的)1、什么是继承?继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。2、 继承的定义类似下面这种格式,我们把Student叫做派生类,public叫做继承方法,People叫做基类class Student:public People...

2019-08-04 00:16:06 189

原创 泛型编程之模板

1、模板是什么?顾名思义,模板就像是一个模具一样,你给他什么原材料,他最终都形成一个东西,只是里面的材料不同。对比到我们的学 习中就是,把具有某一类特定规律的算法抽象出来,形成一个模板,用的时候你就很方便,根据需要传不同类型的数据都可以。2、模板的分类 模板分为函数模板 和 类模板<函数模板> 1、函数模板 :函数模板代表了一个函数家族,该...

2019-08-03 20:14:20 171

原创 优先级队列——priority_queue

1、什么是优先级队列? 顾名思义就是带有优先级的队列,既然是队列,就只能再一端插入,在另一端提取元素,优先级体现在,随便插入元素,他会自动按照大或者这小的顺序进行排序。2、用什么结构来实现它呢? 如果我们用普通的数组,那么入队时很简单直接随便放入数组,只需要O(1)的时间,然而在出队时要挑选最大的那个优先级,则需要O(n)的时间。同样如果是...

2019-08-03 17:48:23 229

原创 STL六大组件——容器适配器

什么是适配器?举个例子:在日常生活中,当手机没电了,我们需要给手机充电,给手机充电的方式很多,可以插到电源上,也可以用充电宝,还可以直接连着电脑充。而我们并不关心用什么给它充电,我们关心的只是能否给手机充上电。适配器充当的角色就是 给手机充电的接口,它会将不同大小的电压转化成适合给手机充电的电压。容器适配器的概念可以结合这个例子理解,它以 某种容器作为底层结构,改变其接口,使它符合该容...

2019-08-03 16:44:54 1030

原创 STL:List模拟实现

原理:list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。优点:任意位置的插入删除效率很高(双向迭代)缺点:任意位置的随机访问效率很低list的使用#include <iostream>#include <list>void test1(){ std::list<int&...

2019-08-01 10:39:39 386

原创 Vector容器的原理和模拟实现

原理:vector是STL的常见容器之一,vector是表示可变大小数组的序列容器。vector采用的连续存储空间来存储元素。因此,它可以像数组一样用下标对元素进行操作,但它与数组最大的不同就是,它的大小可以改变,并且是自主控制容量的变化。比数组高效很多。 vector的使用#include <vector>#include <iostream&gt...

2019-08-01 10:26:06 607

原创 C++动态内存管理

C语言中,动态内存的管理一般用malloc,calloc,realloc和free这几个函数,他们之间的区别和联系在之前的博客中已经总结过了。C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦,因此C++又提出 了自己的内存管理方式:通过new和delete操作符进行动态内存管理。malloc/freemalloc:用来申请类类型对象空间,对自定义类型...

2019-07-11 23:31:53 172

原创 malloc ,calloc 和 realloc之间的区别?

相同点:都是C语言从堆中申请内存,申请成功的空间必须释放 在使用时,返回类型都是void*,在使用时必须进行强制类型转化 如果申请失败,返回NULL,在使用时必须判空不同点:malloc:void* malloc (size_t size);说明:向系统申请size字节的内存,成功返回所申请的内存(块)的起始地址,失败返回NULL。 ...

2019-07-11 22:56:38 145

原创 一个数组实现两个栈(共享栈)

思路:一个数组实现两个栈,简单的来想就是要把一个数组分成两部分方式一:下标为0的位置是stack1的栈底,下标为1的位置是stack2的栈底,stack1的元素放在下标为偶数的位置,stack2的元素放在下标为奇数的位置。这种分法有一个缺点就是容易造成空间浪费,假如stack1只有2个元素,而stack2有10个元素,最后使用的总空间还是20,但其实只存了12个元素。方式二...

2019-05-13 16:59:54 1388

原创 顺序栈的相关操作(C语言)

//Stack.h#pragma once#define MAX_SIZE 100typedef char StackDataType;typedef struct Stack { StackDataType array[MAX_SIZE]; int top; //表示当前个数}Stack;// 初始化/销毁// 增(只能从栈顶)/删(只能删除栈顶)/查(只能查看栈顶元...

2019-05-10 12:59:11 375

原创 元素出栈、入栈顺序的合法性

问题描述:判断元素出栈、入栈顺序的合法性。如入栈的序列“abcde”,出栈序列为“deabc”思路:定义两个数组分别来存放入栈和出栈序列 步骤1:先将字符串1的第一个字符入栈:步骤2:将该元素与字符串2的第一个元素进行比较步骤3:a):如果相等,就将该元素出栈并且将字符串1的下一个字符入栈,与字符串2的下一个字符进行比较。b):如果不相等,继续将字符串1的下一个字符入栈,继续...

2019-05-10 12:53:05 1088

原创 【栈和队列面试题】两个队列实现一个栈

分析:将queue1用作进栈出栈,queue2作为一个中转站入栈时,直接压入q1中出栈时,先将q1中的元素除最后一个元素外依次出队列,并压入队列q2中,将留在q1中的最后一个元素出队列即为出栈元素,最后还要把q2中的元素再次压入q1中//QStank.h#pragma once#include "Queue.h"//两个队列实现一个栈typedef struct...

2019-05-07 22:44:49 347

原创 【栈和链表面试题】使用两个栈实现一个队列

分析:思路一:将stack1作为存储空间,将stack2作为临时缓冲区,入队时,直接压入stac1,出队时,将stack1中的元素依次出栈压入stack2中,再将stack2的栈顶元素弹出,最后将stack2中的元素再倒回给stack1思路二:入队时,判断stack1是否为空,如果stack1为空,则将stack2中的所有元素都倒入stack1中,再将元素直接压入stack1,否则,直接...

2019-05-07 22:33:46 413

原创 【栈和队列面试题】实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间 复杂度为O(1)

问题描述:实现一个栈,要求Push(入栈),Pop(出栈),Min(返回最小值的操作)的时间复杂度为O(1)//MinStack.h#pragma once#include "Stack.h"#include <assert.h>//最小栈// 初始化// Push/Pop/Top/Min 要求 O(1)typedef struct MinStack {...

2019-05-07 21:43:17 503

原创 判断单链表是否带环?若带环,求环的长度?求环的入口点

问题一:如何判断链表是否带环?思路:利用快慢指针,定义两个指针,同时从链表的头节点出发,一个指针一次走一步,另一个指针一次走两步。如果走的快的指针追上了走的慢的指针,那么链表就包含环;如果走的快的指针走到了链表的末尾都没有追上另一个指针,那么链表就不包含环。 //判断单链表是否带环?ListNode* ListIsCircle(ListNode* first){ if (fir...

2019-04-27 19:58:15 354

原创 逆置/反转单链表

问题描述 : 给出一个单链表的头节点,反转改链表思路: 1、在原链表上做改动,由于是单链表,所以在将B指向前一个A节点后,链表会出现断裂的情况,导致我们之后就无法遍历到节点C,为了避免这种情况,我们要在调整节点B之前,把C节点保存下来。,因此需要定义三个指针。分别指向当前遍历到的节点,它的前一个节点,和后一个节点。//逆置/反转单链表 ListNode* ReserveL...

2019-04-27 19:21:35 433 1

原创 单链表实现约瑟夫环(JosephCircle)

以五个节点的带环单链表(最后一个节点指向第一个节点)为例子假设K为2的情况下: 1 从链表头开始,先删除第二个节点 2 从删除节点的下一个节点开始,再往后找第二个节点,然后删除。 3 一直重复过程2,直到剩下一个节点,返回该节点。ListNode* JosephCircle(ListNode* first, int k){ if (first ...

2019-04-25 22:48:45 823

原创 无头单链表结点的删除、插入问题(不能遍历链表)

删除一个无头单链表的非尾节点(不能遍历链表)例如:无法获取1结点的位置,删除2结点void RemoveNoFirst(ListNode* pos){ pos->data = pos->next->data; ListNode* del = pos->next; pos->next = pos->next->next; ...

2019-04-25 21:20:26 849

原创 从尾到头打印链表(经典面试题)

从尾到头打印单链表 思路:自己画一个简单的链表有助于理解,先来分析打印一次的过程,cur 是用来遍历链表用的。就这个题来说,我么们首先要打印5,也就是当cur->next = NULL时,打印cur->data的值。第二次,要打印4,也就是当cur->next = 5。所以我们需要用一个指针记录每一趟的结尾,并且每一趟都需要从头开始,所以需要一个指针记录头的位置。下...

2019-04-25 20:52:18 447

原创 双链表操作详解

之前学习了单链表的相关操作,但是单链表有一个缺点,无法快速访问前驱结点,当查找到某个元素时,如果想要找到前面元素的结点,需要再次从头遍历,这样就比较麻烦,那么是否可以在节点中再增加一个指针指向前驱结点,答案是可以的。增加了指向前驱结点的指针的链表称为双链表链表分类 链表还有一种常用,那就是循环链表,顾名思义,这种链表就是头尾相连单链表 双链...

2019-04-24 19:53:14 260

原创 线性表之链表

为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。数据域:我们把存储数据元素信息的域称为数据域。 指针域:存储直接后继位置的域称为指针域。 指针/链:指针域中存储的信息称做指针或链。 结点(Node):数据域与指针域这两部分信息组成数据元素ai的存储映像,称为结点(N...

2019-04-23 14:17:52 252

原创 线性表之顺序表

线性表(List):零个或多个数据元素的有限序列1. 首先它是一个序列。也就是说,元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。2. 然后,线性表强调是有限的。事实上,在计算机中处理的对象都是有限的,那种无限的数列,只存在于数学的概念中。如果用数学语言来进行定义:若将线性表记为(a1, ……, ai-1, ai,...

2019-04-23 14:00:25 261

原创 浅谈进程间的通信(一)

为什么要进行进程间通信?      Linux作为一个多任务多进程的操作系统,各个进程之间的信息交互(事件通知,数据传输,进程控制)是不可避免的。进程间通信就是要在不同的进程之间传播或者交换消息。但是由于进程的独立性,所以导致进程间进行数据通信将变得非常麻烦。操作系统不得不提供方法来使进程间能够通信 。           操作系统为我们提供进程间通信的方式其实不止一种,因为通信的公共...

2019-01-25 11:41:49 265

原创 实现mini_shell

通过Linux实现一个mini_shell进程控制是学习系统的一个重要知识点,涵盖有进程创建,进程终止,进程等待,程序替换这些方面。在学完这些知识后,想通过这个mini_shell将之前学过知识做一个小小的综合。思路:获取命令行解析命令行建立一个子进程替换子进程父进程等待子进程退出首先第一步获取命令行,想想之前学过获取数据的方法,有scanf(),fgets();//scan...

2019-01-15 23:19:43 401

原创 Linux-----进程控制

进程创建 fork()1.以父进程为模板复制创建出一个子进程,父子进程代码共享,数据独有(写时复制技术)2.fork返回值,父进程返回子进程pid  子进程返回03.谁先执行取决于CPU调度并行 并发vfork() 也是创建的一个子进程(了解特性即可)      1. 子进程没有(退出)或者运行其他程序则父进程是阻塞的           也就意味着子进程是先运行的。...

2019-01-08 00:00:16 213

原创 札记。

 2018 年 11 月 一只船孤独的航行在海上,它既不寻求幸福,也不逃避幸福,它只是向前航行,底下是沉静碧蓝的大海,而头顶是金色的太阳。莱蒙托夫...

2018-11-04 22:08:51 249

原创 类与对象(上)

 类的两种定义方式有什么区别?    与类的定义相比, 在类内实现成员函数不再是在类内进行声明, 而是直接将函数进行定义, 在类中定义成员函数时, 编译器默认会争取将其定义为 inline型函数在类外定义成员函数通过在类内进行声明, 然后在类外通过作用域操作符 :: 进行实现。TODO:(待补充)为什么说类定义了一个新的作用域? 从定义出发:名词类内,类外,从字面意思...

2018-11-04 01:17:29 204

原创 类与对象——static成员

问题引入:如何知道一个类创建了多少对象? 思考:在类中添加一个普通的成员变量进行计数class Date{public: Date(int year = 1990, int month = 1, int day = 1) :_year (year), _month (month), _day (day), _count(0) { ++_count; }...

2018-11-02 00:49:27 274

原创 数据结构——二叉树习题(二)

1.创建二叉树BTreeNode * CreateNode(int data){ BTreeNode *node = (BTreeNode *)malloc(sizeof(BTreeNode)); node-&gt;data = data; node-&gt;left = node-&gt;right = NULL; return node;}BTreeNode* C...

2018-08-27 17:08:24 1008

原创 数据结构——二叉树习题(一)

1.构造二叉树#pragma once /* Binary Tree *///二叉树#include &lt;stdlib.h&gt;#include &lt;assert.h&gt;#include &lt;stdio.h&gt;#include "Stack.h"typedef int TDataType;typedef struct BTreeNode { T...

2018-08-25 17:12:04 436

原创 三子棋

头文件game.h:#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;time.h&gt;#define ROW 3#define COL 3 void InitBoard(char board[ROW][COL],int row ,int col); void DisplayBoard(char board...

2018-05-25 22:45:23 224

空空如也

空空如也

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

TA关注的人

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