数据结构
墨飏韶年
leetcode:https://leetcode-cn.com/problemset/all/
展开
-
排序算法的总结
外排序:需要在内外存之间多次交换数据才能进行内排序: 插入类排序 直接插入排序希尔排序选择类排序 简单选择排序堆排序交换类排序 冒泡排序快速排序归并类排序 归并排序排序方法 平均情况 最好情况 最坏情况 辅助空间 稳定性冒泡排序 O(n^2) O(n) O(n^2) O(1) 稳定简单选择排序 O(n^2) O(n^2) O(n^2) O(1) 稳定直接插入排序 O...原创 2018-07-09 09:55:40 · 256 阅读 · 0 评论 -
双向链表和双向循环链表
双向链表和双向循环链表和单向链表相比,多了一个前驱结点。如果他为空,那么next和prior都指向自己。而对于双循环链表,只需要最后一个元素的next指向head->next,head->next的prior指向最后一个节点即可。插入操作新节点s插入链表,s->next给p结点,s->prior给p->prior,然后,p->prior->n...原创 2018-08-14 09:28:57 · 625 阅读 · 0 评论 -
栈的各种操作
栈(stack)又名堆栈,是仅允许在表的一端进行插入和删除运算。表尾一端被称为栈顶,相对地,表头称为栈底。Push:向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素。Pop:从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。流程如下 初始化:初始化一个栈的大小为STACK_SIZE,并且将容量s...原创 2018-08-14 09:30:20 · 1712 阅读 · 0 评论 -
栈的应用:中缀和后缀表达式的转换及计算
目录一、两种表达式 二、转化规则和思路 三、代码实现 四、计算后缀表达式的思路一、两种表达式中缀表达式:人使用的类似于(2+3*5),运算符号在数字中间的表达式后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则。这是计算机的计算方式。二、转化规则和思路利用栈,可以实现中缀表达式转化为后缀表达式。...原创 2018-08-14 09:32:20 · 318 阅读 · 0 评论 -
队列和循环队列的实现
队列定义:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(head)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。按照队列的定义,结合内存地址的理解,初始化队列的时候,准备head和rear指针分别指向头和尾。Push操作,只需要改变rear指针;PopLeft操作只需要改变hea...原创 2018-08-15 09:55:54 · 259 阅读 · 0 评论 -
递归和分治思想及其应用
目录递归和分治思想 一些实例 逆序输出字符串 查找数组元祖是否存在 汉诺塔问题 八皇后问题 更多:递归和分治思想如果可以使用迭代,尽量别使用递归。由编译原理可以知道,每次自调用的时候,计算机都需要保存在调用,浪费时间空间。当然,迭代是当我们知道循环次数的时候。而当我们不知道循环次数,比如说对于文件夹和文件进行遍历,不知道深度的情况下,我们就需要递归来实现。显然,...原创 2018-08-15 09:56:12 · 517 阅读 · 0 评论 -
字符串匹配的BF算法和KMP算法学习
引言:关于字符串字符串(string):是由0或多个字符组成的有限序列。一般写作`s = "123456..."`。s这里是主串,其中的一部分就是子串。其实,对于字符串大小关系不如是否相同重要。包括密码验证、hash列等。而字符串的存储结构有两种:顺序存储结构和链式存储结构。由于不同的字符是连在一起的,所以一般是开足够大的空间进行顺序存储,这样更符合字符串的意义。一、BF算法实现...原创 2018-08-15 09:56:30 · 719 阅读 · 0 评论 -
树和二叉树
树不同于队列、栈等一对一的数据结构,树是一对多的数据结构。树(Tree)是n(n>=0)各节点的有限集。当n=0,为空树。在任意一颗非空树中:有且只有一个特定的结点称为:根(Root) 当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、...Tm。其中每一个树本身又是一棵树,并且称为:子树。两点注意:n>0时候,根节点唯一。 m&...原创 2018-08-15 09:56:48 · 141 阅读 · 0 评论 -
数据结构思维导图
数据结构宏观导图 数据结构-第一章概论数据结构第二章-线性表 数据结构第三章-栈、队列、数组 数据结构第四章-树与二叉树 数据结构第五章–图 数据结构第六章–查找 ...转载 2018-08-30 09:46:19 · 2723 阅读 · 0 评论 -
链表是否有环的两种判断方法
判断单链表是否有环假设有一个含环链表:1-2-3-4-5-6-3(6又连接到3,形成一个环) 使用p、q两个指针,p总是向前走,但q每次都从头开始走,对于每个节点,看p走的步数是否和q一样。当p从6走到3时,用了6步;此时q从head出发,则只需两步就到3,因而步数不等,出现矛盾,存在环。而且可以锁定环的位置,就是q的步数+1 使用p、q两个指针,p每次向前走一步,q每次向前走...原创 2018-08-14 09:27:46 · 420 阅读 · 0 评论 -
尾指针及其简单应用
尾指针及其简单应用循环链表如果拿到最后结点,若没有尾指针(rear),那么需要O(n)的时间。如果有的话,只需要O(1)的时间。如果有两个链表,需要将他们连接,拥有尾指针只需要O(1)的时间复杂度。此时,判断循环链表是否为空的方法:rear是否等于rear->next。一道题目:将两个线性表A(a1,a2,a3...)和B(b1,b2,b3...)连接成一个线性表。思路:...原创 2018-08-14 09:25:39 · 7422 阅读 · 0 评论 -
直接插入排序(内部排序 插入排序)
/*直接插入排序1、查找元素在链表中的插入位置2、将插入位置后面的元素后移3、将元素复制到插入的位置 肖煜 */ #include <stdio.h>#include <stdlib.h>#define N 10 void InsertSort (int A[],int n){ int i,j; for(i=2;i<n;i++)...原创 2018-07-21 23:30:21 · 140 阅读 · 0 评论 -
折半插入排序(内部排序 插入排序)
/*算法思想:先折半查找出元素的待插入的位置,然后统一的移动待插入位置后面的元素肖煜 */#include<stdio.h>#include<stdbool.h>void BinaryInsertSort(int *a, int n) { int i, j, k, low, high, m; for(i = 1; i < n; i+...原创 2018-07-22 00:17:49 · 1289 阅读 · 0 评论 -
快速排序
#include<stdio.h>void QuickSort(int a[],int left,int right){ int i = left; int j = right; int temp = a[left]; if (left>=right) return; while(i!=j) { while(i<j&&a[j]>...原创 2018-07-27 14:45:46 · 152 阅读 · 0 评论 -
一窥--顺序表和单链表
顺序表和单链表真正意义上自己弄出来的,发篇博客记录一下顺序表 单链表顺序表类似于数组,元素都是相邻的,这也决定了它比较容易和比较适合查询。但缺点就是在插入和删除的时候需要移动大量的元素。时间复杂度查询操作 O(1) 插入和删除操作 O(n)代码实现#include<iostream>#include<string>using...原创 2018-08-14 09:17:55 · 170 阅读 · 0 评论 -
再窥--单链表和顺序存储
先接一下上次的笔记,实现对单链表进行删除思路实现声明结点p和q 首节点赋值给p,下一个结点赋值给q 循环执行释放p,将q赋值给p的操作(删除第一个结点后,之后的结点就是首节点了,以此类推)string ClearList(Node *L){ Node *p,*q; p = L->next;//指向首节点 while(p){ q =...原创 2018-08-14 09:20:09 · 204 阅读 · 0 评论 -
无指针的静态链表的实现
早期语言没有c,更不用说java等一些高级语言。那么是怎么描述链表这种实现呢?这次以单链表的模拟为例,深究一下 静态链表 的实现。静态链表结构按照之前单链表的性质,我们需要游标和数据。当然,每个元素都有下标(类似数组)游标的含义静态链表中,首节点和尾结点都没有数据(数据为空)首节点的游标指向第一个含有数据为空的元素的下标。最后一个节点的游标指向第一个含有数据(不为空)的元素...原创 2018-08-14 09:21:19 · 576 阅读 · 0 评论 -
快慢链表和快慢指针
腾讯的一道面试题:如何快速找到位置长度单链表的中间节点?普通方法,就是先遍历,在从头找到2/length的中间节点。算法复杂度是:O(3*n/2)。而更快的方法就是利用快慢指针的原理。快慢链表:利用标尺的思想,设置两个指针(一快一慢)*serach和*mid,刚开始都指向单链表的头结点。但是*search指针的移动速度是*mid的两倍。当*search到尾结点的时候,mid刚好到了中间。算...原创 2018-08-14 09:22:39 · 362 阅读 · 0 评论 -
循环链表和约瑟夫环
循环链表的实现单链表只有向后结点,当单链表的尾链表不指向NULL,而是指向头结点时候,形成了一个环,成为单循环链表,简称循环链表。当它是空表,向后结点就只想了自己,这也是它与单链表的主要差异,判断node->next是否等于head。代码实现分为四部分:初始化 插入 删除 定位寻找代码实现:void ListInit(Node *pNode){ int ...原创 2018-08-14 09:24:15 · 223 阅读 · 0 评论 -
单链表的操作:节点查找、节点插入、节点删除、求单链表长度
本节讲解一下单链表中节点的查找、插入、删除、求单链表长度等操作。按序号查找结点值在单链表中从第一个结点出发,顺指针next域逐个往下搜索,直到找到第i个结点为止,否则返回最后一个结点指针域NULL。按序号查找结点值的算法如下:LNode GetElem(LinkList L,int i){ //本算法取出单链表L(带头结点)中第i...转载 2019-04-12 11:32:46 · 4019 阅读 · 1 评论