数据结构
文章平均质量分 56
CairBin
这个作者很懒,什么都没留下…
展开
-
C++栈应用——括号匹配
学过数据结构的大多都做过这道题,给定一串表达式,匹配前后对应的括号。实际上思路很简单,由于栈是(先进后出)的,字符串读取顺序从左到右,左括号一定在右括号左面,利用几点,我们在读取字符串的时候将左括号(或其位置)入栈,读到右括号就出栈即可。原创 2023-05-24 21:10:03 · 730 阅读 · 0 评论 -
Hash表(哈希表、散列表)
哈希表,也叫散列表,英文Hash table,是根据关键码值而直接进行访问的数据结构。原创 2022-11-22 18:39:43 · 2953 阅读 · 0 评论 -
有向无环图——AOV网及拓扑排序
public :aov() {public ://前驱结点 set < int > next;//后继结点 //备份 set < int > back_prev;};//邻接表 public :private :};原创 2022-11-08 15:53:09 · 586 阅读 · 0 评论 -
哈夫曼树及哈夫曼编码(基于优先队列实现)
首先定义一个哈夫曼树的类private ://结点定义 class node {public ://权值 node * lc , * rc;//左儿子结点,右儿子结点 string code;} };private ://存放结点指针的优先队列(小根堆) node * root;//根结点 unordered_map < char , string > un_map;原创 2022-10-25 01:51:29 · 948 阅读 · 0 评论 -
二叉搜索树BST
/左儿子 node * rc;//右儿子 };private ://对外接口 public :BST();//内部接口及功能实现 private :};它的结点包含一对键值对,此处为了方便全用整型变量表示(当然可以写成泛型的形式,但是应当注意键的类型需能比较大小或重载了该运算符)另外,由于BST也是一种二叉树,所以结点也满足二叉树的结点定义,即包含左儿子指针和右儿子指针。原创 2022-10-18 21:49:33 · 407 阅读 · 0 评论 -
数据结构——堆
堆堆的概念堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象,即是一种顺序储存结构的完全二叉树。1提示:完全二叉树完全二叉树:对一棵深度为k、有n个结点二叉树编号后,各节点的编号与深度为k的满二叉树相同位置的结点的编号相同,这颗二叉树就被称为完全二叉树。2堆的性质堆中某个结点的值总是不大于或不小于其父结点的值堆总是一棵完全二叉树除了根结点和最后一个左子结点可以没有兄弟结点,其他结点必须有兄弟结点最大堆最小堆3最大堆:根结点的键值是原创 2022-04-09 15:52:08 · 2060 阅读 · 0 评论 -
数据结构——并查集
并查集说明并查集是一种精巧使用的数据结构,主要用于处理一些不相交的集合合并问题。经典的例子有连通子图、最小生成树Kruskal算法和LCA等。原理将编号分别为1~n个对象分为不相交的集合,每个集合中,选择其中某个元素代表所在的集合。在这个集合中,并查集的操作有初始化、合并、找查。步骤初始化定义数组int s[]是以结点i为元素的并查集,在开始的时候没处理点与点朋友关系,所以每个点都属于独立的集,并且以元素i的值表示它的集s[i].//初始化void init_set(int n原创 2022-04-03 18:44:00 · 973 阅读 · 0 评论 -
二叉树及其遍历
二叉树及其遍历二叉树概念定义什么是二叉树二叉树特点是每个节点最多只能有两棵子树,且有左右之分的树。注:关于数据结构——树的一些基本概念可以参考《树的概念及基本术语》 - CairBin’s Blog二叉树的基本性质关于二叉树的基本性质前面已经写的很详细了,可以回顾文章《二叉树》 - CairBin’s Blog二叉树结构体定义结构体定义及其构造函数//链式二叉树结构体定义typedef struct _BinTree{ int data; //存放数据 struct _BinT原创 2022-03-07 01:28:51 · 695 阅读 · 0 评论 -
DFS与N皇后问题
DFS与N皇后问题DFS什么是DFSDFS是指深度优先遍历也叫深度优先搜索。它是一种用来遍历或搜索树和图数据结构的算法注:关于树的一些知识可以去看《树的概念及基本术语》这篇文章它会不断地沿着节点的深度方向(该深度方向为其邻接点的方向)进行遍历DFS如何实现DFS主要步骤有以下几步访问并从某节点向邻接点出发,访问路径向深处走若走到最深处还有节点没访问,则再回到该层访问该节点(回溯)依次重复上述步骤,直至所有路径都被访问(递归)DFS时空复杂度空间复杂度DFS算法实际上是一个递原创 2022-03-05 23:38:30 · 646 阅读 · 0 评论 -
队列及其操作
队列队列的定义队列简称队,是一种受限制的线性表,仅允许在表的一端插入,在表的另一端进行删除。进行插入的一端叫做队头进行删除的一端叫做队尾队的特点**先进先出(FIFO) **顺序队(循环队列)顺序队主要以循环队列的形式出现循环队列的要素队空状态 qu.rear == qu.front队满状态 (qu.rear+1)%MAXSIZE == qu.front结构体定义#define MAXSIZE 1024typedef struct _Queue{ int原创 2021-12-18 18:13:52 · 237 阅读 · 0 评论 -
数据结构——二叉树
二叉树二叉树的定义二叉树在一般的树上加了两个限制条件:每个结点最多只有两个子树子树有左右之分,不能颠倒二叉树的形态空二叉树只有根结点只有左子树,右子树为空只有右子树,左子树为空既有左子树,又有右子树满二叉树、完全二叉树以及非完全二叉树满二叉树:所有的分支结点都有左、右子节点,并且所有叶子结点都集中在最下层的二叉树。完全二叉树:对一棵深度为k、有n个结点二叉树编号后,各节点的编号与深度为k的满二叉树相同位置的结点的编号相同,这颗二叉树就被称为完全二叉树非完全二叉树:没有满原创 2021-11-21 15:28:22 · 822 阅读 · 0 评论 -
字符串定义及操作
串串的定义概念串是由零个或多个字符数组组成的有限序列。串中字符的个数称为串的长度,含有零个元素的叫空串。串是限定了元素为字符的线性表(注:串与一般的线性表操作有很大区别,线性表主要针对表内的某个元素,而串操作主要针对子串)代码在C语言中,一个串可以如下定义,但仅以’\0’作为结束符时需要我们遍历整个数组,时间复杂度为O(n),这并不是我们想要的最优结果,其他方法会在下文“串的结构体定义”部分有详细描述,这里仅举个例子char str[] = "as123";对C语言来讲,串主要由原创 2021-11-05 01:17:18 · 780 阅读 · 0 评论 -
树的概念及基本术语
树树的定义树是一种非线性数据结构,它是若干结点的集合。是由唯一的根和若干不相交的子树组成的。子树又是一颗树,因此树的定义是递归的。树的结点数目可为0,此时称之为空树。树的基本术语结点(结点包含数据元素和指向子树的分支)路径:一个结点和另一个经过的边和结点的序列根(根结点):一棵树的顶点结点的度:结点拥有子树和分支的个数。树的度:树中结点度的最大值。叶子结点(终端结点):度为0的结点。分支结点(非终端结点):度不为0的结点。孩子:结点的子树的根。双亲(父结点):指向该结点的原创 2021-10-31 16:49:08 · 243 阅读 · 0 评论 -
链栈的操作
链栈的定义#include <iostream>using namespace std;//链栈,理论上只要内存够大不存在上溢,只存在下溢(栈空后继续取出元素)typedef struct _QNode{ int data; struct _QNode *next;}StNode;链栈的操作初始化bool initStack(StNode* &st){ st = new StNode; if(!st) return false; st->next原创 2021-10-10 15:17:57 · 135 阅读 · 0 评论 -
顺序栈的操作
栈的定义#include <iostream>#define MAXSIZE 1000using namespace std;//顺序栈typedef struct{ int data[MAXSIZE]; //存放栈顶元素 int top; //栈顶指针}SqStack;栈的操作初始化//初始化顺序栈bool initStack(SqStack &st){ st.top = -1; return tr原创 2021-10-07 20:50:49 · 511 阅读 · 0 评论 -
Linux内核链表之共享双链表
说明共享双链表意义在于,可以用一套函数维护不同数据类型的双链表准备定义双链表#include <iostream>#include <string>using namespace std;//此处并不包含数据域,仅有指针域用于连接结点typedef struct _DbLinkList{ struct _DbLinkList *next; struct _DbLinkList *prev;}DbLinkList;定义结构体//定义数据类原创 2021-10-05 14:21:14 · 142 阅读 · 0 评论 -
栈的概念及性质
栈的基本概念栈的定义栈是一种只能在一端进行插入或删除的线性表。其中插入被称作进栈,删除被称作出栈。允许进行插入或删除操作的一端被称为栈顶,另一段被称为栈底,栈底固定不变。其中,栈顶由一个称为栈顶指针的位置指示器来指示。(PS:栈顶指针并非传统意义上的指针,比如顺序栈用的是一个整型变量来指示,但是我们依然称其为栈顶指针)栈的特点先进后出栈的数学结构当n个元素以某种顺序进栈,并且在满足先进后出的前提下可任意时刻出栈,所获得的元素排列数目满足函数 Catalan( )的计算,即:当然你也可原创 2021-09-28 21:38:07 · 1583 阅读 · 0 评论 -
双链表的操作
双链表的代码定义#include <iostream>using namespace std;typedef struct _DLNode{ int data; //结点数据域 struct _DLNode *next; //指向后继的指针 struct _DLNode *prev; //指向前驱的指针 }DbLinkNode,DbLinkList;双链表的操作初始化双链表//初始化双链表bool initDbLinkList(原创 2021-09-28 11:40:54 · 86 阅读 · 0 评论 -
顺序表的应用——逆置问题
顺序表应用——逆置问题问题描述给定一个顺序表,将其中的元素逆置例子给定一个顺序表,其中有0至10共11个元素从小至大排列,请将这11个元素逆置使其从大到小排列以下是解题代码代码#include <iostream>#define MAXSIZE 100typedef struct{ int data[MAXSIZE]; int length;}Sqlist;//输出元素void printList(Sqlist L){ for(int n = 0;原创 2021-09-25 11:06:13 · 312 阅读 · 0 评论 -
循环链表应用——约瑟夫置换
约瑟夫问题介绍约瑟夫问题,又称约瑟夫置换、丢手绢问题。一般形式(本部分内容来自百度百科)约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。代码问题描述本文以以下问题为例编号为1-10的10 个人围成一圈,从第一个开始报数,第9个被淘汰出圈,剩下的组成新的圈。依次这样下去,求最后一个人的编号解决注意:该段代码与上篇文章——《 循环链表定义及操作 》相接//解答约瑟夫问题b原创 2021-09-18 23:16:59 · 197 阅读 · 0 评论 -
循环链表定义及操作
循环链表定义定义与单链表一样,操作时将末结点的指针指向开始结点即可typedef struct _LinkNode{ int data; struct _LinkNode *next;}LinkList;循环链表操作初始化循环链表bool InitList(LinkList* &L){ L = new LinkList; if(!L) return false; L->next = L; L->data = 0; //原创 2021-09-18 22:16:21 · 1052 阅读 · 0 评论 -
单链表的操作
单链表代码定义typedef struct LinkNode{ int data; //data存放结点的数据域(以int类型为例) struct LinkNode *next; //结点的指针域}LinkNode, LinkList;单链表的操作初始化单链表bool initList(LinkList* &L) //L类型为引用类型的指针{ L = new LinkNode; //为L分配一个动态内存 if(!L) return false;原创 2021-09-12 13:56:54 · 412 阅读 · 0 评论 -
链表的定义
链表链表的概念定义:链表是一种物理存储单元上非连续、非顺序的存储结构,由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。在链表的储存上,每个结点不仅包含所存的元素信息,还包含元素间的逻辑信息。链表的特性不支持随机访问:不能通过知道第一个元素的地址(即储存空间的首地址)可以轻松访问储存的所有数据。节点的储存空间利用率相对顺序表较低:链表中的每分一个结点需要划出一部分空间来储存指向下一个结点位置的指针支持储存空间的动态分配:链表中当前结点的位置是由其前驱结点中的地址信息所指原创 2021-08-19 21:32:56 · 3929 阅读 · 0 评论 -
顺序表的操作
顺序表的操作这里先定义个顺序表#include <iostream>using namespace std;#define MAXSIZE 100typedef struct{ int *elems; int length; int size;}Sqlist;Sqlist list;顺序表初始化定义bool类型函数 initList() ,初始化成功为true,失败为false//初始化顺序表,创建一个空表bool initList(Sqlist原创 2021-08-09 17:40:58 · 344 阅读 · 0 评论 -
顺序表的概念及定义
顺序表节点的概念节点 :节点是内存中一片由用户分配的储存空间,只有一个地址来表示它的存在,没有显式名称。在学习顺序表时,一般不会去特别强调节点的概念,此概念往往在链表学习中涉及,但并不代表节点与顺序表无关,所以我特意把节点的概念放在此处以加深对顺序表的理解。顺序表的概念定义:把逻辑上相邻的节点储存在物理位置上的相邻储存单元中,节点的逻辑关系由储存单元的邻接关系来体现通俗来讲,顺序表就是把线性表中的所有元素按照其逻辑顺序,依次储存到从指定的储存位置开始的一块连续的储存空间中。第一个元素的储存位置原创 2021-08-09 14:30:14 · 1812 阅读 · 0 评论