自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 树---求给定二叉树中两节点的最低公共祖先(LCA)

一、问题描述对于一颗二叉树,给定其中的两节点n1,n2,求出他们的最低公共祖先(Lowest Common Ancestor )。例如: 二、问题求解利用递归思想。(1)从root开始遍历,如果n1和n2中的任一个和root匹配,那么root就是LCA。(2) 如果都不匹配,则分别递归左、右子树,如果有一个 key(n1或n2)出现在左子树,并且另一个key(n1或n2)出现在右子树,则roo

2015-10-31 21:37:18 551

原创 树---Binary Search Tree(二叉搜索树BST)

一、什么是二叉搜索树BST中文翻译为:二叉搜索树,或者二叉查找树,或者二叉排序树。二叉树(binary)是一种特殊的树:二叉树的每个节点最多只能有2个子节点。 给二叉树加一个额外的条件,就可以得到一种被称作二叉搜索树(binary search tree)的特殊二叉树。二叉搜索树要求:每个节点都不比它左子树的任意元素小,而且不比它的右子树的任意元素大。 (如果我们假设树中没有重复的元素,那么上述

2015-10-30 17:25:23 1019

原创 面试---两个队列实现一个栈

解法思路:(1)设置两个队列q1和q2。(2)栈的push操作:每次往非空队列里插入元素。起初都为空的时候则往q1中插入。(3)栈的pop操作:把非空队列里除最后一个元素外先转移到另一队列(为空),然后把剩下的最后一个元素弹出。这样另一个队列便作为下次插入的对象。(4)以此类推。注:此过程中,新push进来的元素总是插入到非空队列中,空队列则用来保存pop操作之后的那些元素,那么此时空队列不

2015-10-27 13:05:04 420

转载 堆(heap)和栈(stack)有什么区别?

简单的可以理解为: heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。 stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。 预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(he

2015-10-27 10:33:11 961

原创 面试---两个栈实现一个队列

实现思路:插入操作在stack1中进行,删除操作在stack2中进行(1)入队列:直接压入stack1即可(2)出队列:如果stack2不为空,把stack2中的栈顶元素直接弹出;否则,把stack1的所有元素全部弹出压入stack2中,再弹出stack2的栈顶元素。实现代码:#include<iostream>#include<stack>using namespace std;templa

2015-10-26 22:55:22 361

转载 堆栈、栈帧、函数调用过程

一、堆和栈首先,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。程序对内存的使用分为以下几个区:(1)栈区(stack):由编译器自动分配和释放,存放函数的参数值,局部变量的值等。操作方式类似于数据结构中的栈。(2)堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。与数据结构中的堆是两码事,分配方

2015-10-26 14:11:35 1722

转载 Python读写json格式文件

转自:http://blog.csdn.net/zhanh1218/article/details/26009329?utm_source=tuicool&utm_medium=referral JSON-是一个轻量级的数据交换格式。意味着可以被N多语言读取;可以存在本地,避免数据多次处理; 还可以通过socket和网络上其他计算机交换数据。一、dump dump (obj, fp, skipke

2015-10-25 16:31:38 12454

转载 栈---定义、应用(递归、后缀表达式实现数学表达式求值)

一、定义栈是限定仅在表尾进行插入和删除操作的线性表。因此,栈的表尾端称为栈顶;表头端称为栈底。不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIF0结构。理解栈的定义需要注意:首先它是一个线性表,也即栈元素具有线性关系,即前驱后继关系。只不过它是一种特殊的线性表而已。栈的插入操作,叫作进栈,也称压栈、入栈。栈的删除操作,叫作出找,也有的叫作弹栈。

2015-10-23 17:22:35 4684

原创 栈---链栈

一、栈的链式存储结构栈的链式存储结构,简称为链栈。链栈是没有附加头结点的运算受限的单链表。栈顶指针就是链表的头指针。栈是用栈顶来做插入和删除操作,那么对于链栈的栈顶放在链表的头部还是尾部呢?单链表有头指针,而栈顶指针也是必须的,所以比较好的办法是把栈顶放在单链表的头部。另外,都已经有了栈顶在头部了,单链表中比较常用的头结点也就失去了意义,通常对于链栈来说,是不需要头结点的。链栈的结构如下: 对于空

2015-10-23 10:58:46 991

原创 栈---顺序栈

一、栈的顺序存储线性表用数组来实现顺序存储,但是对于栈这种只能在一端插入删除的线性表来说,可以用数组实现顺序存储吗?用那一端作为栈顶和栈底比较好?答案是肯定的。并且下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它作栈底。我们定义一个top变量来指示栈顶元素在数组中的位置,top就如同游标卡尺的游标,它可以来回移动,意味着栈顶的top可以变大变小,但无论如何游标不能超出尺的长度。

2015-10-22 15:28:40 856

转载 队列---循环队列与链队列比较

对于循环队列与链队列的比较,可以从两方面来考虑:1、从时间上,其实它们的基本操作都是常数时间,即都为0(1)的,不过循环队列是事先申请好空间,使用期间不释放,而对于链队列,每次申请和释放结点也会存在一些时间开销,如果入队出队频繁,则两者还是有细微差异。2、对于空间上来说,循环队列必须有一个固定的长度,所以就有了存储元素个数和空间浪费的问题。而链队列不存在这个问题,尽管它需要一个指针域,会产生一些空间

2015-10-21 23:11:45 5011

原创 队列---链队列:队列的链式存储结构

一、链队列的基本结构队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列。为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端结点。链队列示意图:当队列为空时,front和rear都指向头结点。二、链队列结构体定义链队列结构体的定义,需要两个步骤: (1)链队列节点的定义/* QElemType类型根据实际情况而定,这里假设为int */t

2015-10-21 23:06:28 7394

转载 队列---循环队列

前面讲到了队列的“假溢出”,解决假溢出的办法就是后面满了,就再从头开始,也就是头尾相接的循环。我们把队列的这种头尾相接的顺序存储结构称为循环队列。比如前面的例子,rear可以改为指向下标为0的位置,这样就不会造成指针指向不明的问题了。 但是如果继续进行入队操作的话,比如继续插入a6、a7,则rear指针就与front指针重合,同时指向下标为2的位置。 此时问题又出来了,我们刚才说,空队列时,等于

2015-10-21 16:57:12 751 2

转载 队列---顺序队列存储结构的不足(假溢出)

我们假设一个队列有n个元素,则顺序存储的队列需建立一个大于n的数组,并把队列的所有元素存储在数组的前n个单元,数组下标为0的一端即是队头。所谓的入队列操作,其实就是在队尾追加一个元素,不需要移动任何元素,因此时间复杂度为0(1)。可有时想想,为什么出队列时一定要全部移动呢,如果不去限制队列的元素必须存储在数组的前n个单元这一条件,出队的性能就会大大增加。也就是说,队头不需要一定在下标为0的位置,比如

2015-10-21 16:38:11 22479 11

原创 队列---基本概念、顺序队列

一、基本概念队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。队列基本操作:InitQueue()   ——初始化队列EnQueue() ——进队列DeQueue() ——出队列IsQueueEmpty()

2015-10-20 10:27:07 6169 2

原创 线性表---单循环链表(约瑟夫环问题)

约瑟夫环问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。代码:#include <iostream>#include <stdio.h>#include<malloc.h>using namespace std;typedef struc

2015-10-19 14:52:16 910

原创 线性表---双向链表(创建、正序逆序打印、插入、删除)

双向链表是为了满足更加方便的查找前驱,而付出空间的代价的一个数据结构。建立双向非循环链表代码如下:#include<iostream>#include<malloc.h>using namespace std;typedef struct dnode{ int num; struct dnode *pre; struct dnode *next;}dNode;dNod

2015-10-18 18:36:42 1595

转载 线性表---双向循环链表

双向链表双(向)链表中有两条方向不同的链,即每个结点中除next域存放后继结点地址外,还增加一个指向其直接前趋的指针域prior。 注意:链表由头指针head惟一确定的。带头结点的双链表的某些运算变得方便。将头结点和尾结点链接起来,为双(向)循环链表。双向链表的结点结构和形式描述结点结构(见上图)形式描述如下:typedef char ElemType;struct NodeType2{

2015-10-18 17:02:18 456

转载 线性表---单链表(头结点与头指针)

当链表的每个结点只包含一个指针域时,我们称此链表为单链表。关于单链表的存取,有时候我们在单链表的第一个结点(有效元素)之前附设一个结点,称之为头结点;指向头结点的指针,称之为头指针;对单链表的存取必须从头指针开始进行,由于单链表的最后一个数据元素没有直接后继,则指针为NULL。 对于头结点,数据域可以不存储任何信息,也可存储如链表长度等附加信息。下面是带头结点的单链表与空表的比较图。 头指针与头

2015-10-18 15:40:02 1727

转载 线性表---顺序存储结构与链式存储结构比较

1、顺序存储结构优点: 1)随机存取(时间复杂度为O(1)); 2)无需为表示表中元素之间的逻辑关系而增加额外的存储空间; 缺点: 1)插入、删除操作需要移动大量元素,效率低(时间复杂度为O(n)); 2)表的长度难以确定2、链式存储结构优点: 1)插入、删除不需要移动数据,效率高(时间复杂度为O(1)); 缺点: 1)存取时需要遍历,效率低(时间复杂度为O(n));3、适用的场合顺

2015-10-18 15:15:06 935

原创 线性表---顺序表(查找、插入与删除)

代码:#include<iostream>using namespace std;#define maxsize 20/* 存储空间初始分配量 */typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */typedef struct{ ElemType a[maxsize];/* 数组,存储数据元素,最大值为MAXSIZE */

2015-10-18 15:06:16 1044

原创 线性表---顺序表

1、线性表线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。线性表——List,零个或多个数据元素的有限序列。首先它是一个序列。也就是说,元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最

2015-10-18 13:07:45 556

原创 线性表---单链表(逆置)

假设需要逆序的单链表为: 则逆置以后的链表为: 代码如下:#include<iostream>#include<malloc.h>using namespace std;typedef struct node{ int num; struct node *next;}Node;Node * CreateList(int a[], int n){ Node *he

2015-10-18 10:54:32 2378

原创 线性表---单链表(一次遍历找链表倒数第n个节点)

#include<iostream>#include<malloc.h>using namespace std;typedef struct node{ int num; struct node *next;}Node;Node * CreateList(int a[], int n){ Node *head, *p, *q; head = (Node*)ma

2015-10-17 21:26:42 1643

原创 线性表---单链表(创建、找中间节点、删除头元素)

#include<iostream>#include<malloc.h>using namespace std;typedef struct node{ int num; struct node *next;}Node;Node * CreateList(int a[], int n){ Node *head, *p, *q; head = (Node*)ma

2015-10-17 20:50:23 649

原创 线性表---单链表(创建、插入、删除、排序、测长和打印输出)

实现了动态建立一个学生信息的链表,并能够进行创建、插入、删除、排序、测长和打印输出等操作。/*-----------------------------------------------------------------////////关键部分代码用序号标出////////////--------------------------------------------------------

2015-10-16 15:57:37 2553

原创 继承与接口---子类的访问权限

请考虑标记为A到J的语句在编译时可能出现的情况。如果能够成功编译,请记为RIGHT,否则标记为ERROR。#include<iostream>#include<stdio.h>class Parent{public: Parent(int var=-1) { m_nPub=var; m_nPtd=var; m_nPrt=var;

2015-10-13 10:04:53 666

转载 继承与接口---覆盖、虚继承

一、关于覆盖:(1)成员函数的覆盖:子类对父类的成员函数覆盖,必须函数名称一致,参数一致,返回值一致(当然编译器决定);!!!!!(2)成员变量的覆盖:子类覆盖的仅仅是继承来的那个成员变量,而并不改变原来父类中的变量;!!!!!(3)构造函数从基类开始构造,各个类的同名变量没有形成覆盖,都是单独的变量。子类调用就近原则,如果父类存在相关接口则优先调用,如果父类不存在则调用祖父类接口;当然,如

2015-10-12 10:49:30 660

原创 模板类与类模板的区别以及模板类的友元重载

#include <iostream>using namespace std;template <class T>class Test;//声明template <class T>ostream& operator<<(ostream& out,const Test<T> &obj);//声明template <class T>class Test{private: int nu

2015-10-11 23:37:35 2880

转载 关于C++中的友元函数的总结

1.友元函数的简单介绍1.1为什么要使用友元函数在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。具体来说:为了使其他类的成员函数直接访问该类的私有变量。即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数。实际上具体大概有下面两种情况需要使用友元函数:(1)运算符重载的某些场合

2015-10-11 21:40:47 571

原创 拷贝构造函数调用时机

拷贝构造函数在以下三种时机被调用1、 对象以值传递的方式传入函数参数#include <iostream>using namespace std;class CExample{private: int a;public: //构造函数 CExample(int b) { a = b; cout<<"creat: "<<a<<end

2015-10-11 20:02:26 1425

原创 为什么析构函数可以为virtual型,而构造函数则不能?

构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。不建议在构造函数和析构函数里面调用虚函数。构造函数不能声明为虚函数的原因是:解释一:所谓虚函数就是多态情况下只执行一个。而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象。如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显式的调用构造。还有一个原因就是为了防错,试想如果你在子类中一不小心重写

2015-10-11 13:55:15 2554

转载 静态联编和动态联编

联编就是将模块或者函数合并在一起生成可执行代码的处理过程,同时对每个模块或者函数调用分配内存地址,并且对外部访问也分配正确的内存地址,它是计算机程序彼此关联的过程。按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。静态联编是指在编译阶段就将函数实现和函数调用关联起来,因此静态联编也叫早绑定,在编译阶段就必须了解所有的函数或模块执行所需要检测的信息,它对函数的选择是基于指向对象的

2015-10-11 11:37:46 420

原创 虚析构函数与多态

多态基类的析构函数应该为虚函数#include <iostream>using namespace std;class Base{public: Base() { cout<<"Base()"<<endl; } virtual ~Base()//多态基类的析构函数应该为虚函数!!!!!! { cout<<"~Base()"

2015-10-10 23:46:29 536

转载 类中static静态变量与const常量成员的初始化

1、static 成员在类外初始化2、const 成员(及引用成员)在类的构造函数初始化列表中初始化3、static const /const static 成员可以在类中初始化(实际上是申明)也可以不初始化,同时需要在类外定义#include <iostream>#include <string>using namespace std;class MyTestClass{public:

2015-10-10 22:16:46 1038

原创 初始化列表成员变量的初始化

对于以下程序:#include <iostream>using namespace std;class Base{private: int a; int b;public: Base(int i):b(i),a(b){} Base():b(0),a(b){} int get_a(){return a;}

2015-10-10 21:55:54 720

原创 类的静态成员函数和静态数据成员

一、基本知识当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享。各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关。静态方法就是与该类相关的,是类的一种行为,而不是与该类的实例对象相关。静态数据成员的用途之一是统计有多少个对象实际存在。静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝图,在其中

2015-10-10 21:31:27 2170

转载 你会解吗? ?+?+?=30 把下面数字填到框里 (1,3,5,7,9,11,13,15)

以下程序转自知乎#include <iostream>#include <stdio.h>using namespace std;int main(){ for(int base = 9 ; base <= 19; base++) {//数字到9,所以最小是9进制 int number[8] = {1, 3, 5, 7, 9, base + 1, base + 3, b

2015-10-09 23:03:25 22272

转载 C++中struct和class的区别

一、C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。struct能包含成员函数吗? 能!struct能继承吗? 能!!struct能实现多态吗? 能!!!最本质的一个区别就是默认的访问控制,体现在两个方面:1)默认的继承访问权限。struct是public的,class是private

2015-10-09 22:22:53 391

转载 C++中的空类默认产生哪些类成员函数?

如果你只是声明一个空类,不做任何事情的话,编译器会自动为你生成一个默认构造函数、一个拷贝默认构造函数、一个默认拷贝赋值操作符和一个默认析构函数。这些函数只有在第一次被调用时,才会别编译器创建。所有这些函数都是inline和public的。定义一个空的C++类,例如class Empty{}一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明一些member functio

2015-10-09 21:43:25 6158

空空如也

空空如也

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

TA关注的人

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