
数据结构:线性表
文章平均质量分 96
主要记录:数组,链表,栈,队列 数据结构的学习过程
z_stand
远离颠倒梦想,究竟涅槃
展开
-
关于 并查集(union find) 算法基本原理 以及 其 在分布式图场景的应用
二月的最后一篇水文…想写一些有意思的东西。图计算或者存储场景中的 好友关系拓扑分布式事务场景中冲突环中的 死锁检测部分原创 2022-02-27 13:54:10 · 2207 阅读 · 2 评论 -
skiplist跳表的 实现
文章目录前言跳表结构时间复杂度空间复杂度高效的动态插入和删除跳表索引的动态更新总结详细实现前言rocksdb 的memtable中默认使用跳表数据结构对有序数据进行的管理,为什么呢?同时redis 也用跳表作为管理自己有序集合的数据结构,为什么他们不选择用红黑树来管理(同样能够提供高效的插入,查找,删除操作,而且各种语言都已经封装好了很多轮子),就选择跳表来实现?今天就来仔细探讨一下这个数据结构。跳表结构对于一个单链表来说,即使链表中存储的数据结构是有序的,想要查找一个元素也需要从头到尾进行查找原创 2020-05-31 20:44:18 · 546 阅读 · 0 评论 -
栈 -- 顺序栈、链式栈的实现 及其应用(函数栈,表达式求值,括号匹配)
我们使用浏览器的时候经常会用到前进、后退功能依次访问完一串页面 a – b – c之后点击后退功能,则能够依次看到c – b – a的页面。但是这个过程中,如果后退到了页面b,点击了新的页面d,则再点击前进无法回到页面c。这个过程的实现就是我们 “栈”数据在其中起作用了。实现栈的基本实现有如下两种:顺序栈 – 基于数组的实现链式栈 – 基于链表的实现顺序栈实现#include <iostream>#include <assert.h>using nam原创 2020-05-10 17:41:16 · 692 阅读 · 0 评论 -
LRU算法 -- 链表 完整实现
LRU算法(Least Recently Used) 算是我们经常遇到的一种淘汰算法,其中内存管理模块进行内存页回收时有用到,针对不经常使用的内存页,LRU淘汰策略能够将该内存页回收给操作系统。属于 我们操作系统设计中的 时间局部性原理,最长时间未被访问的数据优先淘汰,当内存中已存在的数据再次被访问时,则进行热度的提升。本文为了巩固数据结构相关知识,特 使用链表数据结构方式完整实现LRU链表...原创 2020-04-27 22:43:39 · 827 阅读 · 0 评论 -
C++的STL 栈 实现四则运算
使用栈实现四则运算,支持+,-,*,/,(,)输入为字符串,输出为计算好的数值,如不符合四则运算的规定,则异常退出这个实现借用了栈以及字符处理状态机的思想:维护两个栈:一个用于数值,另一个用于存放计算符号字符状态机用于遍历输入的字符串过程中进行对应数值处理和计算符号处理的状态转换在第一个思想中:符号栈中存在优先级,即*和/的优先级高于+和-,同时括号的优先级高于*和/,所以符号栈的入...原创 2019-11-02 20:21:17 · 811 阅读 · 0 评论 -
C++的STL 栈实现 判断栈的出栈顺序是否合理
有这样的题目:已知从1至n的数字序列,按顺序入栈,每个数字入栈后即可出栈, 也可在栈中停留,等待后面的数字入栈出栈后,该数字再出栈,求该数字序列的出栈序列是否合法?类似如下:已知栈的出栈序列为:3 2 5 4 1,判断该栈的出栈序列是否合法过程如下:第一次1-5顺序入栈:1,2,3第二次 3 出栈:1,2第三次 2 出栈:2第四次 4,5 入栈:1,4,5第五次 5 出栈:1,4...原创 2019-11-02 19:16:27 · 852 阅读 · 0 评论 -
C++的STL栈实现获取栈中最小元素的成员
实现一个获取栈中最小数据成员的函数,该栈支持如下操作:1.push(x) : 将元素x压入栈中2.pop() : 弹出(移除)栈顶元素3.top() : 返回栈顶元素4.getMin() : 返回栈内最小元素要求时间复杂度为O(1)这里关键是如何获取最小值,栈中的元素不断增加,且要达到O(1)常数级的时间复杂度,即创建好的栈进行排序,返回最小值是不可行的。这里只有在创建过程中将栈中的...原创 2019-10-31 01:07:56 · 915 阅读 · 0 评论 -
C++的STL栈实现队列
使用内部存储结构为栈的方法实现一个队列,要求实现该队列的如下方法:1.push(x) : 将元素x压入队列中2.pop() : 弹出(移除)队列头部元素3.peek() : 返回队列头部元素(即为front)4.empty() : 判断队列是否是空栈的数据结构为先入后出,队列的数据结构为先入先出使用栈来实现队列,同样想要让两者弹出的数据保持一直,内部的数据存储顺序是相反的;可行的办法...原创 2019-10-31 00:54:27 · 451 阅读 · 0 评论 -
C++的STL队列实现栈
使用C++的队列STL实现一个栈的数据结构实现以下四个函数:1.push(x) : 将元素x压入栈中2.pop() : 弹出(移除)栈顶元素3.top() : 返回栈顶元素4.empty() : 判断栈是否是空队列的数据结构为先入先出,栈的数据结构为先入后出;即队列的元素顺序与栈中元素的顺序是相反的,所以只需要保证后面插入的元素是在前面的元素之前能够被弹出即可。转换成栈之后的存储...原创 2019-10-31 00:45:43 · 338 阅读 · 0 评论 -
C语言的单链表实现队列
队列是一种FIFO(先入先出)的数据结构C++的STL std::queue q; 相关的队列操作,包括q.empty() 判读队列是否为空q.front() 返回队列的首元素q.back() 返回队列的末尾元素q.pop() 弹出队列的头部q.push(x) 将x添加至队列q.size() 返回队列的大小本文使用C语言的链表,实现队列以上操作(文末有测试代码)emptybo...原创 2019-10-29 23:56:41 · 376 阅读 · 0 评论 -
C语言的双向链表头插法和尾插法,指定节点删除
文章目录前言头插法尾插法删除节点测试代码如下前言双向链表和单链表的唯一区别就是多个一个指针域而已,该指针域可以访问链表的上一个节点。关于构造双向链表的过程我们常见的有两种方法,和单链表一样:头插法和尾插法。头插法:字面意思也是很好理解,每次插入的元素在上一个节点之前尾插法:字面意思也表达出了每次的元素插入会在上一个节点之后详细插入过程可以参考如下头插法头插法基本过程如下图,已经描...原创 2019-10-29 00:58:30 · 3359 阅读 · 1 评论 -
C++的多个有序链表合并
已知k个已排序链表头节点指针,将这k个链表合并,合并后仍为有序的 ,返回合并后的头节点如下三个链表:合并后的结果如下:方法一(STL sort算法进行排序):先将输入的排序链表插入一个迭代器中,vector数组中国呢直接对数组中的链表节点进行按值排序即可实现算法如下,最终实现源码见文末:bool cmp(Data *A, Data *B) { return A->...原创 2019-10-26 01:25:06 · 1042 阅读 · 0 评论 -
C语言的有序单链表合并
已知两个已排序链表头节点指针headA与headB,将这两个链表合并,合并后仍为 有序的,返回合并后的头节点。主要步骤如下:创建一个临时的头节点,头节点每次指向headA 或者 headB较小的节点当headA->data 比headB->data小的时候,headA的当前节点加入临时头节点,同时headA指针向后移动;否则headB加入临时头节点,同时headB指针向后移动...原创 2019-10-24 00:34:45 · 1682 阅读 · 0 评论 -
C语言的单链表分割
已知链表头指针head与数值x,将所有小于x的节点放在大于或等于x 的节点前,且保持这些节点的原来的相对位置。这个过程有点类似于快速排序,寻找一个阈值,比该阈值小的放左边,比该阈值大的放右边。只是由数组遍历变为来链表遍历,操作变成了指针的指向。具体步骤如下:创建一个less_ptr,负责对less端的链表进行维护创建一个more_ptr,负责对more端的链表进行维护最终进行less...原创 2019-10-21 23:25:27 · 969 阅读 · 0 评论 -
C语言单链表求环,并返回环的起始节点
若链表中存在环,找出其中的环所在的节点,否则,返回NULL在没有C++ set容器的优势前提下,我们对这样的环型的寻找以及定位可以利用快慢指针来实现。有环的存在,类似与操场跑圈,必然存在快慢之分。有了快慢,就一定会有交点。反之,有了交点,就一定存在环。实现过程如下:slow指针移动一次,fast指针移动两次,当fast指针和slow指针相等时保留相等时的节点根据运算,从相等时的节点和...原创 2019-10-21 23:05:25 · 504 阅读 · 0 评论 -
C语言的单链表求交点
单链表求交点,问题如下:使用o(1)的空间复杂度,求两个链表相交的时候的交点,这个思想就类似于使用o(1)的空间复杂度和o(n)的时间复杂度来求链表的第k个节点。过程如下:获取两个链表的长度将较长的链表移动和短链表长度差值的位置移动后两个链表长度一样,然后一起移动,这样就知道节点相等的时候链表相交算法实现如下:get_intersection_node函数/*获取交叉链表的节...原创 2019-10-21 22:49:15 · 668 阅读 · 0 评论 -
C语言的单链表逆序和指定范围逆序
前言关于链表的逆置,是考察对链表指针的理解。知道了如何不实用额外空间,同时使用O(n)复杂度对链表进行逆序之后将会对链表有好理解。同时关于如何在指定范围内对链表逆置同样可以进一步加深理解逆序基本过程如下:保留原始链表的next指针域,p = head -> next将原始链表的next指针域指向新链表的头部,head -> next = new_head新链表指针向前移...原创 2019-10-21 00:10:34 · 378 阅读 · 0 评论 -
C语言的单链表创建:头插法/尾插法
文章目录前言链表头插法链表尾插法源码实现前言接下来一段时间,将对数据结构进行复习,总的来说数据结构自大学之后忘记得有点吓人,为了防止脑容量本就小得脑袋更小,必须得持续性得温故了。链表数据结构得提出 是为了弥补数组上 元素插入、删除导致大量元素移动得缺点,这里将C语言得指针提取出来构造一个指针管理得存储数据得结构,使用链式得方式消耗极少对资源(指针的指向,地址得删除)能够对单个元素得插入删除进...原创 2019-10-21 00:11:05 · 547 阅读 · 0 评论