![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
白帽子hhh
这个作者很懒,什么都没留下…
展开
-
常用的排序算法
关于常用的排序算法有:插入排序:直接插入排序、希尔排序选择排序:直接选择排序、堆排序交换排序:冒泡排序、快速排序(4种逐渐优化)归并排序:归并排序一下分别给出以上方法具体代码,并且堆快速排序做出几种优化:(1)子区间优化方法,即可以在最后几层也就是区间不大情况下,直接选择插入排序消耗更少(2)取key关键字用三数取中的方法,保证它既不是最大也不是最小,提高效率(原创 2017-11-22 13:30:54 · 232 阅读 · 0 评论 -
STL中的vector
关于vector的介绍:(1)vector是可变大小的序列容器。(2)和数组一样支持随机访问(3)容量的存在为的是留一些额外的空间以适应可能的增长(4)尾上操作效率相对较高,但是其它位置操作相对较低构造函数:(1)vector() 无参构造(2)vector(size_t n, const T& val=T()) //n个val(3)vector(const ve...原创 2019-03-20 17:47:43 · 555 阅读 · 0 评论 -
返回二叉树的后序遍历(非递归实现)
题目描述:分析:本题目也是通过栈实现。也是将左路结点入栈且不访问,但是它与中序的区别是:中序从栈顶取出结点后,访问这个结点,再递归该结点的右子树,但是后续是取出栈顶结点,不访问该结点,而是直接访问该结点的右子树(子问题)。不过这里需要的是,有两种情况下可以直接访问栈顶结点(1)当栈顶结点的右子树为空时,可以直接访问栈顶元素(2)栈顶元素的右子树不为空时,必须缺确认右子树已经访问过了,...原创 2019-03-04 12:24:10 · 642 阅读 · 0 评论 -
从前序与中序遍历序列构造二叉树
题目描述:分析:前序可以确定根,通过根可以将中序划分成左、右子树。依次类推,前序的下一个节点可以将左子树分成左子树、右子树,将右子树分成左子树、右子树.../** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * ...原创 2019-03-03 17:51:09 · 580 阅读 · 0 评论 -
返回二叉树的中序遍历(非递归实现)
题目描述:分析:本题目和上一题“返回二叉树的前序遍历”类似。也是通过栈实现,但是与前序的区别是:前序遍历将将左路结点入栈的同时依次访问结点,而中序遍历将只是左路结点依次压入栈,但是此时并不访问(由于中序遍历是左-根-右),而是出栈的时候访问栈顶元素,再访问栈顶元素的右子树(子问题)。在C语言中,我们先得利用单链表实现栈以及部分接口。(由于要访问栈顶元素的右子树,因此栈元素类型是T...原创 2019-03-03 14:55:08 · 539 阅读 · 0 评论 -
返回二叉树的前序遍历(非递归实现)
题目描述:分析:本题目需要借助于栈实现(栈用数组实现,其中元素类型是二叉树结点的指针,即TreeNode*,因为我们从栈顶取出元素时,要找到其右子树)。从根结点开始,访问左路节点,并依次将访问过的结点入栈,直到左路结点访问完。然后依次访问栈顶元素的右子树(模拟子问题)。在C语言中,自己得先实现栈,以及栈的部分接口。另外由于我们事先不知道二叉树有多少个结点,因此还得先遍历一遍求出结...原创 2019-03-03 13:31:40 · 377 阅读 · 0 评论 -
模拟实现“队列”数据结构
队列也是一种特殊的数据结构,原则是先进先出(FIFO)。只允许在一端插入,称为“队尾”,在另一端删除,称为“队头”。队列可以用数组、链表实现,但是用链表实现更优。以下就是使用链表实现的。Queue.h#pragma once#include "Commen.h"//队列-->单链表实现typedef int QDataType;typedef struct Que...原创 2019-02-26 19:06:24 · 273 阅读 · 0 评论 -
模拟实现“栈”数据结构
“栈”是一种数据结构-特殊的线性表。原则是后进先出(LIFO)。只允许在固定的一一端进行插入、删除,称为“栈顶”,而另一端称为“栈底”。“栈”可以用数组、链表来模拟实现,但是数组方式更优,以下我们就使用数组来模拟实现。Stack.h #pragma once#include "Commen.h"//栈--数组实现typedef int STDataType;typede...原创 2019-02-26 17:34:32 · 191 阅读 · 0 评论 -
检查括号是否匹配问题
借助于栈实现:方法(1):依次读取每个字符,如果是左括号就入栈,如果是右括号,看栈顶是否是对应的左括号,是的话弹出栈顶元素,代表一对括号匹配完毕,再判断下一个字符。不是的话,说明匹配失败。最后记得要判断栈为空才匹配成功,防止左括号个数与右括号个数不一致。方法(2):与方法1思想一致,只是方法二的扩展性较好,假如增加其它的括号(如<、>)等。方法一代码:(如果是C语言中,前提是你...原创 2019-02-26 17:25:55 · 6322 阅读 · 0 评论 -
实现一个最小栈
设计一个栈,支持push、pop、top等操作。并且能够在O(1)的时间内检索到最小元素,即设计一个“最小栈”。思路:用两个栈实现。一个普通栈,一个min栈(普通栈负责数据的入、出,min栈的栈顶永远保存当前元素的最小值)。第一次入栈时,入到普通栈、min栈中。再次入往普通栈入数据时,当该数据<=min栈栈顶元素时,也将该数据入到min栈中,否则只入到普通栈中。从普通栈出数据时,该数据==m...原创 2019-02-26 17:20:31 · 268 阅读 · 0 评论 -
用栈实现队列
使用两个栈(一个入栈,一个出栈)实现队列。入栈时就往"入栈"中放数据,出栈时从"出栈的栈顶取数据",如果出栈为空,就从"入栈"中将数据倒过来,而且只需倒一次,就可以达到"队列"的效果。在C语言中,我们需要自己定义栈数据结构以及一些操作,再创建该结构的两个栈对象。而在C++中,我们可以直接调用库创建两个栈变量。以下代码的前提是假设我们已经实现好了栈结构及其接口(Stack)以下是数据结构以及一些...原创 2019-02-26 17:15:27 · 333 阅读 · 0 评论 -
设计循环队列
循环队列,也叫“环形队列”。它指的是:将队列抽象成一个环形,如果队头前面有空间,我们可以继续使用。环形队列可以用数组、链表实现,以下我们使用数组实现。环形队列的队头front表示第一个入队的元素下标,队尾rear代表最后一个有效元素的下一个位置下标。因此,环形队列判空条件是front==rear,判满的条件是(rear+1)%n==front.n表示数组总大小(n=k+1,k表示有效元素个数)...原创 2019-02-26 17:08:04 · 770 阅读 · 0 评论 -
给定一个二叉树,返回它的前序遍历
函数原型:int* PreOrderTraverSal(struct TreeNode* root, int* returnSize);returnSize拿到二叉树结点个数,返回前序遍历结果存的空间起始地址。方法一:在C语言中,我们需要创建一个动态顺序表来存储二叉树的遍历顺序,但是如果在C++中的话,可以直接使用vector,它就是现成的动态顺序表。//先创建一个动态顺序表,并...原创 2019-02-28 16:14:45 · 2554 阅读 · 0 评论 -
用队列实现栈
用两个队列->栈。始终保持一个队列是空的(用来倒数据),入数据时往非空的那个队列入,出数据时将非空队列中n-1个数据倒在空队列中,令最终剩的那个数据出去。这样就模拟出栈的思想。由于对于队列来说,倒一次数据并不改变原数据的顺序,因此每次出数据都要倒一次,而不像两个栈实现队列,两个栈只要倒一次数据就可以实现队列的思想。 需要注意的是,在C语言中,假定我们已经实现了队...原创 2019-02-28 14:38:15 · 113 阅读 · 0 评论 -
模拟实现“堆”数据结构
“堆”是一种特殊的数据结构,可以将其看成是一棵“完全二叉树”的顺序存储。堆可以用数组来实现。完全二叉树的结点存储在数组中时,父结点与左孩子、右孩子的关系是:(1)一个节点的下标是i,其左孩子下标是2*i+1,右孩子下标是2*i+2 (2)一个节点的下标是i,其父结点的下标是(i-1)/2.另外判断下标为i的结点是不是叶子结点,看它的左孩子下标是否存在,即(2*i+1)<数组长度,说明它没...原创 2019-02-27 16:41:07 · 161 阅读 · 0 评论 -
STL中的List
以下的List的模拟实现:#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>#include <assert.h>#include <stdlib.h>using namespace std;//模拟实现list//STL中的list是带头的、双向循环链表//链表中的迭代器是被封装...原创 2019-03-22 17:56:16 · 139 阅读 · 0 评论