数据结构
艾伦lee
系借此向大家交流学习
展开
-
(一)线性表的顺序存储实现
线性表的顺序存储设计与实现1.概念 用一段地址连续的存储单元依次存储线性表的数据元素2.设计与实现(1)插入元素 a 判断线性表是否合法 b 判断插入位置是否合法 c 把最后一个元素到插入位置的元素后移一个位置 d 将新元素插入 e 线性表长度加1(2)获取元素位置 a 判断线性表是否合法 b 判断插入位置是否合法 c 直接通过数组下标的方...原创 2018-03-17 16:05:31 · 1426 阅读 · 0 评论 -
使用堆栈计算后缀表达式
使用堆栈计算后缀表达式一、实现栈结构根据栈的先进后出的特点,很容易设置栈结构的接口:入栈、出栈、判空、size()等。可以用线性表的方法来实现一个栈结构,其实也就两种,用链表或数组实现栈。但是,在C++标准库中已经为我们实现了栈结构,而且是按照最高效率、最优的标准实现的,可以放心的使用C++标准库提供的栈结构,以C++一贯的作风,其实现的栈结构是一个栈类型,定义在<stack&g...原创 2019-01-29 16:01:18 · 5456 阅读 · 1 评论 -
外部排序
外部排序 给你一个包含20亿个int类型整数的文件,计算机的内存只有2GB,怎么给它们排序?一个int数占4个字节,20个亿需要80亿字节,大概占用8GB的内存,而计算机只有2GB的内存,数据都装不下!可以把8GB分割成4个2GB的数据来排,然后在把他们拼凑回去。如下图: 排序的时候可以选择快速排序或归并排序等算法。为了方便,我们把排序好的2G有序数据称...原创 2018-11-26 16:21:45 · 22354 阅读 · 9 评论 -
树、森林和二叉树的转换
树、森林和二叉树的转换1.树转换为二叉树(1)加线。在所有兄弟结点之间加一条连线。(2)去线。树中的每个结点,只保留它与第一个孩子结点的连线,删除它与其它孩子结点之间的连线。(3)层次调整。以树的根节点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明。(注意第一个孩子是结点的左孩子,兄弟转换过来的孩子是结点的右孩子)2.森林转换为二叉树(1)把每棵树转换为二叉树。...原创 2018-08-14 23:27:32 · 698 阅读 · 0 评论 -
二叉树的前序遍历、中序遍历和后序遍历之间还原二叉树
二叉树的前序遍历、中序遍历和后序遍历之间还原二叉树1、概念(1)前序遍历 a、访问根节点;b、前序遍历左子树;c、前序遍历右子树。(2)中序遍历 a、中序遍历左子树;b、访问根节点;c、中序遍历右子树。(3)后序遍历 a、后序遍历左子树;b、后续遍历右子树;c、访问根节点。2、前序遍历和中序遍历还原二叉树思想如下: a、根据前序遍历结果,第一个元素为二叉树的根结...原创 2018-06-21 09:57:03 · 56720 阅读 · 16 评论 -
(七)基数排序
基数排序1、思想与概念 基数排序(radix sort)是一种用在卡片排序机上的算法。基数排序是先按最低有效位进行排序来解决卡片排序问题的。然后算法将所有卡片合并成一叠,其中0号容器中的卡片都在1号容器中的卡片之前,而1号容器中的卡片又在2号容器中的卡片前面,以此类推。之后,用同样的方法按次低有效位对所有的卡片进行排序,并把拍好的卡片再次合并成一叠。重复这一过程,直到对所有的d位数字都进行了...原创 2018-05-07 20:49:30 · 474 阅读 · 0 评论 -
(六)计数排序
计数排序1、计数排序思想 计数排序假设n个输入元素中的每一个都是在0到k区间的一个整数,其中k为某个整数。当k=O(n)时,排序的运行时间为O(n)。 计数排序的基本思想是:对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x放到它在输出数组中的位置。当有几个元素相同时,要做修改,不能把它们放在同一个输出位置上。2、伪代码*COUNTING-SORT(A, A.len...原创 2018-05-07 11:22:21 · 388 阅读 · 0 评论 -
(五)快速排序
快速排序1.快速排序的描述通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,基准数据排在这两个子序列的中间;然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。采用分治思想,对一个输入的子数组A[p…r],按以下三个步骤进行排序:分解:以数组A[p]为基准元素将A[p…r ]划分成三段A[p…q-1]...原创 2018-05-05 09:28:20 · 222 阅读 · 0 评论 -
(九)快速排序随机化版本
快速排序随机化版本1、描述 采用一种称为随机抽样(random sampling)的随机化技术,使得分析更加简单。与始终采用A[r]作为主元的方法不同,随机抽样是从子数组A[p…r]中随机选择一个元素作为主元。首先将A[r]与从A[p…r]中随机选出的一个元素交换。通过对序列p,…,r的随机抽样,可以保证主元元素x=A[r]是等概率地从子数组的r-p+1个元素中选取的。PARTITIO...原创 2018-05-10 16:28:51 · 1072 阅读 · 0 评论 -
(八)桶排序
桶排序1、思想概念 桶排序(bucketsort)假设输入数据服从均匀分布,平均情况下它的时间代价为O(n)。计数排序假设输入数据都属于一个小区间内的整数,而桶排序则假设输入是由一个随机过程产生,该过程将元素均匀、独立地分布在[0,1)区间上。 桶排序将[0,1)区间划分为n个相同大小的子区间,或称为桶。然后,将n个输入数分别放到各个桶中。因为输入数据是均匀、独立地分布在...原创 2018-05-09 15:29:32 · 266 阅读 · 0 评论 -
(九)队列的链式存储结构设计与实现
队列的链式存储结构设计与实现1、概念 队列也是一种特殊的线性表;可以用线性表的链式存储来模拟队列的链式存储。2、实现(1)linkqueue.h#ifndef _MY_LINKQUEUE_H_#define _MY_LINKQUEUE_H_typedef void LinkQueue;LinkQueue* LinkQueue_Create();void LinkQueue_De...原创 2018-04-13 15:22:41 · 409 阅读 · 0 评论 -
(八)队列的顺序存储设计与实现
队列的顺序存储设计与实现1、概念 队列是一种特殊的线性表;队列仅在线性表的两端进行操作;对头(Front)是取出元素的一端;队尾(Rear)是插入数据元素的一端;队列不允许在中间部位进行操作。 队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。2、队列模型与链表模型的分析3、代码实现(1)seqqueue.h#ifndef _MY_SEQQUEUE_H_#define _M...原创 2018-04-13 11:11:55 · 340 阅读 · 0 评论 -
(七)栈的应用
栈的应用1、就近匹配 (1)算法思路 从第一个字符开始扫描,当遇见普通字符是忽略,当遇见左符号时压入栈中,当遇见右符号时从栈中弹出栈顶符号,并进行匹配。 匹配成功:继续读入下一个字符; 匹配失败:立即停止,并报错。 结束:成功:所有字符扫描完毕,且栈为空。 失败:匹配失败或所有字符扫描完毕但栈非...原创 2018-04-13 10:51:16 · 228 阅读 · 0 评论 -
(六)栈的链式存储设计与实现
栈的链式存储设计与实现1、栈的链式存储是通过线性表的链式存储来模拟的。在头部添加或删除元素不会涉及到数组元素的大量移动。2、栈的链式存储思路基本与线性表的链式存储一致,可参考线性表的链式存储。线性表的链式存储3、相关代码(1)linkstack.h#ifndef _MY_LINKSTACK_H_#define _MY_LINKSTACK_H_typedef void LinkStack;...原创 2018-04-13 09:51:44 · 420 阅读 · 0 评论 -
(五)栈的顺序存储设计与实现
栈的顺序存储设计与实现1、stack概念 栈是一种特殊的线性表;栈仅能够在线性表的一段进行操作;栈顶(top)是允许操作的一端;栈底(bottom)是不允许操作的一端。 线性表的顺序存储来模拟栈的顺序存储时,在尾部添加或者删除元素,不会涉及到数组元素的大量移动。 2、设计与实现 栈顺序存储的实现思路基本与线性表的顺序存储思路一致,可参考前面文章理解。点击打开链接3、代码(1)seqS...原创 2018-04-10 23:10:56 · 685 阅读 · 0 评论 -
(四)双向链表的设计与实现
双向链表的设计与实现1.概念 在单链表的结点中增加一个指向其前驱的pre指针。双向链表拥有单链表的所有操作。2.设计与实现 (1)插入操作a. 插入第一个元素异常处理: if(next != NULL) {next->pre = node; }node->pre = current;b.在0号位置处插入元素: 新来结点node前pre指向null...原创 2018-04-10 22:53:40 · 509 阅读 · 0 评论 -
(三)循环链表的设计与实现
循环链表的设计与实现1.概念 将单链表中最后一个数据元素的next指针指向第一个元素。在循环链表中可以定义一个“当前”指针,这个指针通常称为游标,可以通过这个游标来遍历链表中的所有元素。2.设计与实现(1)插入元素分析node->next = current->next;current->next = node;先1后2(2)删除结点 1、 删除普通结点 ...原创 2018-03-18 13:56:35 · 403 阅读 · 0 评论 -
(二)线性表的链式存储实现
线性表的链式存储设计与实现1.概念 (1)为了存储每个数据元素和其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息之外,还需存储只是其直接后继的信息。n个结点链接成一个链表,每个结点只包含一个指针域,又叫单链表。 (2)单链表正是通过每个结点的指针域将线性表的数据元素按其逻辑次序链接在一起。 (3)表头结点:链表中的第一个结点,包含指向第一个数据元素的指针和链表自身的一些信...原创 2018-03-18 10:19:59 · 388 阅读 · 0 评论 -
堆栈实现中缀表达式转为后缀表达式
堆栈实现中缀表达式转为后缀表达式(1)规则 中缀表达式转为后缀表达式也有一定的规则,这个规则是根据操作符的运算优先级来定的转为后缀表达式的规则为:如果遇到操作数,我们就直接将其输出。 如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。 如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注意,左括号只弹出并不输出。 如果遇到任...原创 2019-01-29 16:06:54 · 5408 阅读 · 0 评论