![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
生活在醉光明的角落
这个作者很懒,什么都没留下…
展开
-
【C++】单链表的实现
链表概念--链表是一种线性表,但是并不是顺序存储,而是每个节点里面存储着下一个节点的指针,把存储数据元素的数据串链起来。 单链表演示图:#include using namespace std;typedef int DataType; struct LinkNode{ DataType _data; LinkNode* _next;原创 2015-08-25 20:48:31 · 572 阅读 · 0 评论 -
【数据结构】单链表—链表中倒数第K个结点 — 快慢指针
输入一个链表,输出该链表中倒数第K个结点。注:链表的尾结点是倒数第一个结点。 思路一: 遍历一遍链表,求出链表的长度。 正数 = 长度 - 倒数 + 1 如图所示: 然后遍历正数的次数,便得到了倒数第K个结点。但是这种方法需要遍历链表两次。思路二: 遍历一次可以用快慢指针解法,即定义两个指针,快指针和慢指针,求倒数第K个:结点快指针先走K-1步,然后快慢指针一起走当快指针走到结尾,慢原创 2016-07-26 11:40:23 · 499 阅读 · 0 评论 -
【数据结构】单链表—判断一个链表是否形成了环形结构 — 快慢指针
题目:判断一个链表是否形成了环形结构? 思路:定义两个指针,同时从链表的头节点出发,一个指针一次走一步,另一个指针一次走两步,如果走的快的指针追上走的慢的指针,那么链表就是环形链表,如果走的快的指针走到了链表的末尾都没有追上第一个指针,那么这个链表就不是环形链表。代码如下:template<class T>struct ListNode{ T _value; ListNode<原创 2016-07-26 11:48:55 · 715 阅读 · 0 评论 -
【数据结构】单链表—从尾到头输出单链表 — 栈 / 递归
题目:输入一个链表的头节点,从尾到头反过来打印每个节点的值思路一:遍历的顺序是从头到尾,而输出的顺序是从尾到头,也就是说第一个遍历的最后一个输出,最后一个遍历的第一个输出,这是先进后出,我们可以借助栈,遍历链表将每一个节点放入栈中,然后再从栈顶逐个输出节点的值。此时输出的顺序已经反过来了。思路二:可以用栈实现我们就可以想到递归。我们每访问一个结点时,先递归输出后面结点的值,然后再输出自身的值,这样链原创 2016-07-26 12:01:07 · 2411 阅读 · 0 评论 -
【数据结构】单链表—在O(1)时间删除链表结点
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。思路:如果按常规思路来 删除一个结点需要找到该结点的前一个结点,将这个节点的_next指向被删除节点的 _next,找到这个该结点的前一个结点就需要遍历链表,此时就不是O(1)时间。 删除结点我们不需要找到前一个结点,我们可以很方便的找到后一个节点,我们可以把后一个节点的值给前一个结点原创 2016-07-26 13:06:55 · 500 阅读 · 0 评论 -
【数据结构】单链表—合并两个排序链表 — 递归
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍使按照递增排序的。思路: 代码如下:template<class T>struct ListNode{ T _value; ListNode<T>* _next; ListNode(const T& value) :_value(value) ,_next(NULL)原创 2016-07-26 13:26:33 · 436 阅读 · 0 评论 -
【数据结构】单链表—寻找两个相交链表中第一个公共结点 — 蛮力法 / 栈 / 指针先走
题目:输入两个链表,找到它们的第一个公共结点。思路一:蛮力法 在第一个链表上顺序遍历每一个结点,每遍历一个节点在第二个链表顺序遍历每一个结点,如果第二个链表上有一个结点和第一个链表上一样,说明两个链表在这个结点上重合,于是就找到它们的公共结点。len1 = m,len2 = n,时间复杂度为O(mn)。思路二:栈 分别把两个链表的结点放入两个栈里,这样两个链表的尾结点就位于两个栈的栈顶,接下来就原创 2016-07-26 13:44:25 · 643 阅读 · 0 评论 -
【剑指offer】替换空格
题目:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路一:我们首先想到的就是从前往后扫描,如果空格,就替换为%20,但是这样需要移动空格后的元素。 思路二:首先遍历一遍字符串,统计出空格的个数,并可以由此计算出替换之后的字符串的长度。每替换一个空格,长度增加2,因此替换之后的字符串长度等于原创 2016-07-29 22:46:51 · 254 阅读 · 0 评论 -
【剑指offer】二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:从二维数组的右上角的元素开始判断,因为此元素是它所在行的最大数,是它所在的列的最小数。如果它等于要查找的数字,则查找过程结束。如果它大于要查找的数字,则可以排除它所在的列。如果它小于要查找的数字,则可排除它所在的行。这样如果原创 2016-07-29 21:35:29 · 250 阅读 · 0 评论 -
【数据结构】位图
位图(bitmap),就是用一块内存区域的每个比特表示一个对象的数据结构。优点是速度快,内存空间占用小,能表示大范围的数据。假设要对0到一千万范围内的、没有重复元素的正整数排序,则利用位图数据结构很合适。应用场景: 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 思路:如果内存够的话,40亿个整型使用位图存储需要500M左右的空间。#pragm原创 2016-09-04 11:12:22 · 320 阅读 · 0 评论 -
【数据结构】布隆过滤器
布隆过滤器(Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的。 它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难,但是没有识别错误的情形。在日常生活中,包括在设计计算机软件时,我们经常要判断一个元素是否在一个集合中原创 2016-09-04 11:22:57 · 412 阅读 · 0 评论 -
【C++】顺序表的实现
顺序表:用一段地址连续的存储单元依次存储数据元素的线性结构。为什么要实现顺序表? 定义数组,长度是固定的比如数组num,只能存储十个元素,如果多于十个元素,也不能再增加存储空间了,不能动态分配内存。 顺序表是连续的存储空间。不同之处在于可以动态分配内存。静态存储&动态存储 // 顺序表的静态存储(存在的问题:空间不能增大或缩小) typedef int DataType; typede原创 2016-08-13 10:11:44 · 314 阅读 · 0 评论 -
【设计模式】单例模式
单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。有很多地方需要这样的功能模块,如系统的日志输出,GUI应用必须是单鼠标,MODEM的联接需要一条且只需要一条电话线,操作系统只能有一个窗口管理器,一台PC连一个键盘。《设计模式》一书中给出了一种很不错的实现,定义一个单例类,使用类的私有静态指针变量指向原创 2016-09-08 11:47:34 · 384 阅读 · 0 评论 -
【数据结构】单链表—求链表中间节点(只遍历一次链表)— 快慢指针
题目:给出一个单链表的,不知道结点N的值,怎样只遍历一次就可以求出中间结点。我们可以定义两个指针,快指针和慢指针,都从头开始遍历链表,快指针每次走两步,慢指针每次走一步,当快指针走到结尾时,慢指针指向的便是链表的中间节点。代码如下:template<class T>struct ListNode{ T _value; ListNode<T>* _next; ListNode原创 2016-07-26 10:37:59 · 1304 阅读 · 0 评论 -
【数据结构】单链表—逆置单链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并返回反转链表后的头结点。 我们可以借助图来分析一下:我们定义一个新的头结点为head,将begin指向head->_next,当begin不为空的时候,tmp = begin,begin = begin->_next,此时tmp是我们要摘下来的结点。tmp->_next = head; head = tmp;就完成了结点链接的操作。当循环走完时原创 2016-07-26 10:28:26 · 4881 阅读 · 0 评论 -
【数据结构】单链表—冒泡排序
单链表的排序(冒泡排序)原创 2016-07-26 09:56:18 · 658 阅读 · 0 评论 -
【C++】万年历的实现
/******************************************************************************************Date.hpp: Copyright (c) Bit Software, Inc.(2013), All rights reserved.Purpose: 声明并实现一个万年历类【腾讯面试题】原创 2015-08-25 21:01:35 · 1737 阅读 · 0 评论 -
【C++】String类及其优化版的实现
#includeusing namespace std;class String{public: String() { _ptr = new char[1]; _ptr[0] = 0; } String(const char* str) { _ptr = new char[strlen(str)+1]; strcpy(_ptr,str);原创 2015-08-25 21:19:34 · 804 阅读 · 0 评论 -
【C++】顺序表的实现
#include#includeusing namespace std;//typedef struct FindRet//{// bool isFind; // 是否找到的标示// size_t index; // 找到数据的下标//}Findret;typedef int DataType;class SeqList{public:原创 2015-08-25 21:09:02 · 667 阅读 · 0 评论 -
【C++】复数类的实现
#includeusing namespace std;class Complex{private: double _real; double _image;public: Complex(double real = 2.2,double image=1.1)//构造函数 { cout<<"构造函数被调用"<<endl; _real = real;原创 2015-08-25 21:27:10 · 861 阅读 · 0 评论 -
【C++】实现STL模板类string
#include#include using namespace std;class String{public: String() { _str = new char[1]; _str[0] = '\0'; _size = 0; _capacity = 1; } String(const char* str) {原创 2015-09-05 20:16:52 · 538 阅读 · 0 评论 -
【C++】双向链表的实现
该双向链表的头为指针都指向空#includeusing namespace std;typedef int DataType;class LinkNode{ friend class List; friend void Test1(); friend void Test3(); friend void Test4();public: LinkN原创 2015-09-05 20:14:25 · 370 阅读 · 0 评论 -
【数据结构】检查元素出栈的合法性
这个问题是什么意思呢?其实很简单,题目的意思就是想检查一个一个序列是否为另一个序列的合法出栈序列?若1 2 3 4 5为入栈序列,则该序列的合法出栈序列为:5 4 3 2 1 4 3 2 1 5 3 2 1 4 5 等。。。。现在要写一个程序判断该出栈序列是否正确,我们的思想就是,创建两个数组(一个存入栈序列,一个存出栈序列),一个栈。#inc原创 2015-10-31 16:40:21 · 471 阅读 · 0 评论 -
【数据结构】一个数组实现两个栈
数据结构 栈 数组原创 2015-10-31 16:51:17 · 762 阅读 · 0 评论 -
【数据结构】实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)在栈中操作的话,push和pop的时间复杂度就是O(1),所以我们只用实现Min(返回最小值的操作)的时间复杂度为O(1),思想就是用两个栈,一个就是普通的存取数据的栈,另一个为当前未知的最小值,插入数据和删除数据两个栈都进行操作,返回最小值的话,直接对第二个栈操作。代原创 2015-10-31 16:46:37 · 4388 阅读 · 3 评论 -
【数据结构】逆波兰表达式
栈 数据结构 C++ 逆波兰表达式原创 2015-10-31 17:01:28 · 642 阅读 · 0 评论 -
【数据结构】栈以及两个栈实现一个队列
栈以及两个栈实现一个队列//数组版动态增长的栈#pragma oncetemplate class stack{ public : stack() :_top(NULL) ,_base(NULL) ,_size(0) ,_capacity(0) {} void PushStac原创 2015-10-31 17:06:28 · 296 阅读 · 0 评论 -
【数据结构】队列以及两个队列实现一个栈
队列以及两个队列实现一个栈#pragma oncetemplate struct QueueNode{public : QueueNode( const T& x) :_data(x) ,_next(NULL) {} T _data; QueueNode* _next;};template class原创 2015-10-31 17:08:45 · 384 阅读 · 0 评论 -
【数据结构】用栈实现迷宫
#include using namespace std;#define N 10#include struct pos{ int _row;// 行 int _col;// 列};bool cheakstep(pos a){ if(a._col > -1||a._col < N-1|| a._row > -1||a._row原创 2015-10-31 16:28:19 · 1421 阅读 · 0 评论 -
【C++】类型转换
类型转换void Test (){ int i = 1; double d = i; // 隐式类型转换 printf("%d, %.2f\n" , i, d); int* p = &i;// 显示的强制类型转换 int address = (int) p; printf("%x, %d\n" , p, address);}C++强制类型转换stat原创 2016-09-08 18:27:18 · 365 阅读 · 0 评论