数据结构
文章平均质量分 52
数据结构与算法
Garry1115
关注微信公众号“虾米聊吧”,获取更多技术知识干货,一起交流,一起学习~
展开
-
数据结构-栈应用之逆波兰表达式(后缀表达式)
逆波兰表达式含义我就不做赘述了,摘自百科上的一段话:逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法,按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后...原创 2018-10-23 14:08:05 · 600 阅读 · 0 评论 -
数据结构-二叉树的遍历
二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^{i-1}个结点;深度为k的二叉树至多有2^k-1个结点;对任何一棵二叉树T,如果其终端结点数为n_0,...原创 2018-10-23 14:21:54 · 658 阅读 · 0 评论 -
数据结构-二叉树的非递归遍历
前面的章节我们实现了二叉树最基本的遍历方式:递归遍历,代码是如此的简洁;辣么我们为什么还要去学习二叉树的非递归遍历方式呢?众所周知,递归优点是将可以将复杂的问题简单化即大问题拆分成一个个小问题,那么它的缺点是什么呢?缺点就是效率低。对于一个算法来说,其中最重要的一个点就是效率,如果一个算法效率低下,辣么它被使用的概率就很低,因为我们每时每刻都在追求最优解~对于二叉树的非递归遍历我们可以借助栈来...原创 2018-10-23 14:25:35 · 673 阅读 · 0 评论 -
数据结构-二叉树层次遍历
首先介绍下二叉树的层次遍历即按照顺序对树节点依次访问,如下图:顺序遍历的结果为:ABCDEFGHIJK我们可以借助一个队列来实现二叉树的层次遍历;思路如下:先将二叉树根节点入队,然后出队,访问该节点,如果有左子树,则将左子树根节点入队;如果有右子树,则将右子树根节点入队。然后出队,对出队节点访问,如此循环直到队列为空。代码实现://// Created by Ad...原创 2018-10-23 14:57:49 · 11232 阅读 · 5 评论 -
数据结构-二叉排序树
二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;(3)左、右子树也分别为二叉排序树;根据二叉树的定义,左子树节点值<根节点值<右子树节点值。所以对二叉排序树进行中序遍历,可以得到一个递增的有序序列。如图,中序遍历的结果为:1234...原创 2018-10-23 15:01:09 · 554 阅读 · 0 评论 -
数据结构-顺序查找和折半查找
顺序查找即线性查找,通常分为一般无序线性表的顺序查找和有序顺序表的顺序查找。一般线性表的顺序查找:从线性表的一端开始,逐个检查关键字是否满足条件,若存在则查找成功,返回线性表的位置;否则查找失败。有序表顺序查找:即查找之前就已知顺序表是排序了的。假设线性表L是按关键字从小到大排列的,查找的顺序是从前往后查找,待查找元素的关键字为key,当查找到第i个元素时,发现第i个元素对应的关键字小于ke...原创 2018-10-24 14:25:19 · 6790 阅读 · 1 评论 -
数据结构-散列查找
散列函数:一个把查找表中的关键字映射成该关键字对应的地址的函数,记为Hash(key)=Addr。散列函数可能会把两个或以上的不同关键字映射到同一地址,称这种情况为”冲突“,这些发生碰撞的不同关键字称为同义词。一方面,设计好的散列函数应尽量减少这样的冲突;另一方面,由于这样的冲突是不可避免的,所以还要设计好处理冲突的方法。散列表:是根据关键字而直接进行访问的数据结构。也就是说,散列表建立了...原创 2018-10-24 14:27:27 · 704 阅读 · 0 评论 -
数据结构-冒泡排序
冒泡排序算法的基本思想:假设待排序表长为n,从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i]),则交换它们,直到序列比较完。我们称为一趟冒泡,结果将最小的元素交换到待排序列的第一个位置(关键字最小的元素如气泡一般逐渐往上”漂浮“直至“水面”,这就是冒泡排序名字的由来)。下一趟冒泡时,前一趟确定的最小元素不再参与比较,待排序列减少一个元素,每趟冒泡的结果把序列中最...原创 2018-10-24 14:31:31 · 2486 阅读 · 0 评论 -
数据结构-“栈”的基本操作
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)栈的更多概念就不赘述了,详情可以参考百度百科。接下来就来到了我们的动手环节,栈的基本操作包括入栈、出栈、初始化等.栈顶指针:s.top,初始设置s.top=-1;栈顶元素:s.data...原创 2018-10-22 10:39:00 · 2489 阅读 · 0 评论 -
数据结构-队列之顺序队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队...原创 2018-10-22 10:42:50 · 1392 阅读 · 0 评论 -
数据结构-数组与压缩矩阵
数组的定义数组是由n(n>1)个具有相同数据类型的数据元素a1...an组成的有序序列,且该序列必须存储在一块地址连续的存储单元中。1.数组中的数组元素就有相同的数据类型2.数组是一种随机存取结构,给定一组下标就可以访问与其对应的数据元素。3.数组中的数据元素个数是固定的。 行向量的一位数组形式列向量的一位数组形式 数组的两种顺序存储方式1.行...原创 2018-11-20 15:33:29 · 7551 阅读 · 1 评论 -
数据结构-队列之循环队列
将顺序队列臆造为一个环状的空间,即把存储队列元素的表从逻辑上看成一个环,称为循环队列。当队首指针q.front=MaxSize-1后,再前进一个位置就自动归0,可以通过除法取余运算(%)来实现。初始时:q.front = q.rear=0队首指针+1:q.front = (q.front + 1) % MaxSize;队尾指针+1:q.rear = (q.rear + 1) % Max...原创 2018-10-22 10:44:06 · 2755 阅读 · 0 评论 -
数据结构-队列之链式队列
队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表。头指针指向队头节点,尾指针指向队尾节点,即单链表的最后一个节点。当q.front==NULL且q.rear==NULL时,链式队列为空。出队时,首先判断队列是否为空,如果不为空,则取出队头元素,将其从链表中删除,并让q.front指向下一个节点(若该节点为最后一个节点,则置q.front和q.rear都为null)。...原创 2018-10-22 10:49:23 · 2105 阅读 · 1 评论 -
数据结构-栈在括号匹配中的应用
所谓括号校验匹配其实质是对多种类型括号正确配对的校验(包括:()、[]、{})即([])或者[()]为正确的表达式,如果出现交叉则匹配失败,如[(])或([())则为不正确格式。该程序也运用了栈的思想。若是左括号则入栈,若是右括号则看是否和当前栈顶元素是否匹配。若是则出栈,不是则当前表达式括号不匹配。程序思想:1.初始设置一个空栈,顺序读入括号。2.若是右括号,则使置于栈顶的元素出栈与之...原创 2018-10-22 10:58:01 · 2238 阅读 · 1 评论 -
数据结构-栈的灵活表示方式(栈顶指针和栈底指针)
在前面的文章中我们已经学习过基本栈的概念和操作,我们是通过“标准方式”数组的形式模拟了一个栈;本篇文章我将通过一种更灵活的方式定义栈以及实现栈的基本操作,废话不多说,直接上代码(注释都有说明哦)//栈的灵活表示法,通过定义栈顶指针和栈底指针的方式#include <stdio.h>#include <stdlib.h>#define ElementType ...原创 2018-10-22 11:00:22 · 9632 阅读 · 0 评论 -
数据结构-栈之二进制转十进制和八进制
栈满则后进先出原则,我们可以利用此特性实现二进制转十进制、二进制转八进制、二进制转十六进制等相关操作,废话不多说,直接上代码。二进制转十进制://// Created by Administrator on 2018/5/28.////二进制转十进制#include <stdio.h>#include <stdlib.h>#include <...原创 2018-10-22 11:06:58 · 2002 阅读 · 0 评论 -
数据结构-循环单链表之魔术师发牌问题
问题描写叙述: 魔术师手中有A、2、3……J、Q、K十三张黑桃扑克牌。在表演魔术前,魔术师已经将他们依照一定的顺序叠放好(有花色的一面朝下)。魔术表演过程为:一開始,魔术师数1,然后把最上面的那张牌翻过来,是黑桃A;然后将其放到桌面上;第二次,魔术师数1、2;将第一张牌放到这些牌的最以下,将第二张牌翻转过来,正好是黑桃2;第三次,魔术师数1、2、3;将第1、2张牌依次放到这些牌的最以下...原创 2018-05-10 17:51:57 · 508 阅读 · 0 评论 -
数据结构-单链表进阶之快慢指针原理(快速查找法)
面试题:快速找到未知长度单链表的中间节点?这个问题的解决方法分为普通方法和高级方法。1.普通方法即我们大家都能一下子想到的,首先遍历一遍获取总长度L,然后再次遍历循环至L/2即可;时间复杂度为:O(L+L/2)=O(3/2L)代码简单实现:typedef struct { int data; LNode *next;}LNode,*LinkList;/*function:普通方法首先...原创 2018-05-09 19:11:34 · 1806 阅读 · 0 评论 -
数据结构-循环单链表之约瑟夫问题
约瑟夫问题的由来: 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Joseph...原创 2018-05-09 18:07:55 · 1209 阅读 · 0 评论 -
数据结构-链表之单链表
单链表即每个节点都存在数据域和指针域(特殊节点除外),每个节点都一个直接前驱节点和直接后继节点(头节点无前驱,尾节点无后继),简单来说就是上一个节点的指针域中存放了下一个节点的地址,因此可以实现层层节点依次查找,时间复杂度为O(n),这也就是相对顺序表而言的缺点,但是对于频繁的插入和删除节点却是相对于顺序表的优点,除了首次查询为O(n)外,插入和删除都是O(1); 由于顺序表存单元和...原创 2018-05-08 18:00:23 · 459 阅读 · 0 评论 -
数据结构-线性表之顺序表
线性表包括顺序表和链表(单链表、双链表等),这里我们简单探讨一下线性表中顺序表的基本操作和实现。 线性表其实就是对数组的一个实现,其逻辑上和物理存储上的地址都是连续的(数组的下标是从0开始的,而线性表的下标是从1开始的)。 首先声明一个顺序类型的线性表://定义一个结构体类型#define InitSize 100 //初始大小typedef struct { int d...原创 2018-05-08 11:14:41 · 436 阅读 · 0 评论