数据结构和算法基础
本专栏用C++语言实现常用的数据结构和算法(基础)
唐火
开始人工智能之路了!!!
展开
-
对于任给的一张无向带权连通图,求出其最小生成树(C++)
对于任给的一张无向带权连通图,求出其最小生成树。题目要求:(1)编程创建一幅图(2)输出创建的图(3)编写Prim算法代码,实现图的最小生成树求解,且输出最小生成树(4)编写Kruskal算法代码,实现图的最小生成树求解,且输出最小生成树(5)编写菜单,允许用户选择相应操作代码如下:#include <iostream>#include <queue>#include <algorithm>using namespace std;const int原创 2021-12-01 00:49:42 · 3766 阅读 · 0 评论 -
C++实现表达式树
代码如下:#include <iostream>#include <string>#include <stack>#include <queue>using namespace std;class Tree{private: class Node { public: char val; Node * left; Node *right; Node(char val):val(val),left(nullptr),rig原创 2021-11-24 22:41:23 · 1495 阅读 · 0 评论 -
C++实现二叉树
代码如下:#include<iostream>#include <queue>#include <stack>using namespace std;class BinTree{private: class TreeNode { public: int data; TreeNode *left; TreeNode *right; TreeNode ():data(0),left(nullptr),right(nullptr){}原创 2021-11-18 13:22:49 · 885 阅读 · 0 评论 -
编程中的一种特殊递归-尾递归
尾递归:在程序要返回的地方出现递归,从编译的角度来讲,尾递归都可以用循环来实现。例子:二叉搜索树的查找操作Find递归函数可以写成循环的方式实现原创 2021-11-14 22:11:04 · 237 阅读 · 0 评论 -
C++实现双栈结构(一个顺序表中使用两个栈)
因为平常栈中push的数据不会太多,为了节约空间,所以可以在一个顺序表中使用两个栈结构图:在这里我会留一个空间用来判断栈是否满!#include <iostream>using namespace std;typedef int ElemType;class DoubleStack{private: ElemType *top_1; ElemType *base_1; ElemType *top_2; ElemType *base_2;public: Do原创 2021-10-15 12:37:26 · 603 阅读 · 0 评论 -
C++实现顺序串(完整代码)
代码如下:#include<iostream>#include <cstring>#define _CRT_SECURE_NO_WARNINGSusing namespace std;class String{public: String() { size = 0; str = new char[size + 1]; str[0] = '\0'; } String(const String &obj) { size = obj.siz原创 2021-06-22 20:39:29 · 727 阅读 · 0 评论 -
C++实现AOE网中的关键路径算法(邻接表存储)
代码如下:#include <iostream>#include <stack>#include <string>using namespace std;const int N = 10010;using vnodeType = int;typedef struct Node{ int adj; int tw;//弧的时间权值 Node *next;}Node;typedef struct Vnode{ vnodeType v;//..原创 2021-06-22 00:24:55 · 1492 阅读 · 3 评论 -
C++实现拓扑排序(邻接表存储,栈实现)
代码如下:#include <iostream>#include <stack>using namespace std;const int N = 10010;using vnodeType = int;typedef struct Node{ int adj; int w; Node *next;}Node;typedef struct Vnode{ int indegree; vnodeType v; Node *firstEdge;}Vno.原创 2021-06-18 10:43:24 · 249 阅读 · 0 评论 -
C++实现拓扑排序(vector模拟邻接表存储,栈实现)
代码如下:#include<iostream>#include <vector>#include <string>#include <stack>using namespace std;const int N = 10010;int in[N];vector<int>v[N];vector<int>printElem;int main(){ int n, m; while (cin >> n .原创 2021-06-18 10:11:16 · 234 阅读 · 0 评论 -
C++实现拓扑排序(vector模拟邻接表存储,优先队列实现)
代码如下:#include <iostream>#include <queue>#include <vector>using namespace std;const int N = 10010;int in[N];vector<int>v[N];vector<int>print;int main(){ int n, m;//n为点的个数,m为边的条数,点的序号从0开始 while (cin >> n >&.原创 2021-06-16 00:11:17 · 341 阅读 · 0 评论 -
C++ 实现带权有向图的单源点最短路径Dijkstra算法(完整代码)
首先,引进一个辅助向量D,它的每个分量D[i]表示当前所找到的从始点v0到每个终点vi的最短路径的长度。它的初态为:若从v0到vi有弧,则D[i]为弧上的权值;否则,置D[i]为∞。显然,长度为D[j]=Min{D[i]|vi∈V-S}, S初值为{v0}的路径就是从v0出发的长度最短的一条路径。此路径为(v0, vj)。那么,下一条长度次短的路径是哪一条呢?假设该次短路径的终点是vk,可想而知,这条路径或者是(v0, vk),或者是(v0, vj, vk)。它的长度或者是从v0到vk的弧.原创 2021-05-07 20:15:40 · 4594 阅读 · 8 评论 -
C++ 实现布隆过滤器(BloomFilter)
代码如下:#include <iostream>#include <vector>using namespace std;class BitMap{public: BitMap(size_t range) :_bit(range / 32 + 1) {} void set(const size_t num) { int idx = num / 32;//idx 数组下标 int bitIdx = num % 32; _bit[idx] |= 1原创 2021-05-29 13:09:27 · 778 阅读 · 2 评论 -
C++ 实现位图
代码如下:#include <iostream>#include <vector>using namespace std;class BitMap{ BitMap(size_t range):_bit(range/32+1){} void set(const size_t num) { int idx = num / 32;//idx 数组下标 int bitIdx = num % 32; _bit[idx] |= 1 << bitId原创 2021-05-29 12:50:45 · 137 阅读 · 0 评论 -
C++泛型编程实现哈希表(开散列法)
代码如下:#include <iostream>#include <vector>using namespace std;template<typename K>struct HashNode{ typedef HashNode<K> Node; K _val; Node * _next; HashNode(const K & val):_val(val),_next(nullptr){}};template<ty原创 2021-05-28 18:23:56 · 133 阅读 · 0 评论 -
C++泛型编程实现哈希表(闭散列---线性探测)
代码如下:#include <iostream>#include <vector>using namespace std;enum STATE{ EXIST, DELETE, EMPTY};template<typename K,typename V>struct HashNode{ pair<K, V> _kv; STATE _state = EMPTY;};template<typename K,typename原创 2021-05-28 17:14:32 · 142 阅读 · 0 评论 -
C++ 泛型编程 实现红黑树RBTree
代码如下:#include <iostream>#include <ctime>using namespace std;enum COLOR{ BLACK,RED};template<typename T>struct RBTreeNode{ RBTreeNode<T> * _parent; RBTreeNode<T> * _left; RBTreeNode<T> * _right; T _val; C原创 2021-05-26 23:31:37 · 189 阅读 · 0 评论 -
C++泛型编程实现平衡二叉搜索树AVL
代码如下:#include <iostream>using namespace std;template <typename T>struct AVLNode{ typedef AVLNode<T> Node; AVLNode(const T &val = T()):_parent(nullptr),_left(nullptr),_right(nullptr),_val(nullptr),_bf(0){} Node *_parent; N原创 2021-05-26 18:16:56 · 107 阅读 · 0 评论 -
C++泛型编程实现二叉搜索树BST
代码如下:#include <iostream>using namespace std;template <typename K,typename V>struct BNode{ typedef BNode<K,V> Node; K _key; V _value; Node * _left; Node *_right; BNode(const K & key,const V & value) :_key(key),_value(原创 2021-05-26 13:30:35 · 178 阅读 · 1 评论 -
C++ 实现堆
代码如下(小根堆):#include <iostream>#include <assert.h>using namespace std;//小根堆,堆排序从大到小排class Heap{public: Heap():data(nullptr), size(0), capacity(0) {} ~Heap() { delete[] data; data = nullptr; size = 0; capacity = 0; } /*void原创 2021-05-25 13:51:59 · 204 阅读 · 0 评论 -
C语言 实现堆
代码如下:#include <iostream>#include <assert.h>using namespace std;typedef int HDataType;typedef struct heap{ HDataType *data; int size; int capacity;}heap;void Swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp;}void check原创 2021-05-24 22:03:12 · 119 阅读 · 0 评论 -
C++实现归并排序
代码如下:#include <iostream>using namespace std;void Merge(int a[], int mid, int low, int high);void MergeSort(int a[], int low, int high){ if (low < high) { int mid = (low + high) >> 1; MergeSort(a, low, mid); MergeSort(a, mid + 1,原创 2021-05-23 13:18:35 · 136 阅读 · 0 评论 -
C++实现链式基数排序
代码如下:#include <iostream>using namespace std;const int END = -1;const int radix = 10;typedef int KeyType;typedef struct Node{ KeyType key; struct Node *next;} JLNode;JLNode *f[radix], *r[radix];//建立初始单链表,返回该链表的头指针JLNode *Creat_RanLin原创 2021-05-22 22:26:34 · 852 阅读 · 0 评论 -
C++ 简单实现基数排序(list容器)
代码如下:// 思想: // 使用了桶排序中桶的思想,但它比桶排序更精明,它只需要十个桶,因为他的排序思想是分别对元素中 // 的个位,十位,百位....进行排序. // 也就是说,首先对所有数以个位数的大小进行排序,然后再对所有数以他们的十位数进行排序,依次类推. // 在整个过程中会使得原始序列逐渐趋近有序,待将最高位排完之后完全有序. // 想想为什么是从个位开始而不是从最高位开始呢,按道理从最高位开始的话每次都能得出一部分数的正确大小关系. //原创 2021-05-22 18:42:45 · 128 阅读 · 0 评论 -
C++实现各种选择排序(简单选择排序,堆排序)
简单选择排序:代码如下:#include <iostream>using namespace std;void SelectSort(int *a, int len){//数组下标从0开始 for (int i = 0; i < len; i++) { int k = i; for (int j = i + 1; j < len; j++) if (a[j] < a[k]) k = j; if (k != i) { int temp原创 2021-05-22 18:13:34 · 110 阅读 · 0 评论 -
C++实现各种交换排序(冒泡,快速)
冒泡排序:代码如下:#include <iostream>using namespace std;void BubbleSort(int *a, int len){//数组下标从0开始 for (int i = 1;i<=len-1;i++)//共需要len-1趟 for (int j = 1; j <= len - i; j++)//第i趟的比较次数是len-i次 if (a[j - 1] > a[j]) { int temp = a[j原创 2021-05-22 16:41:24 · 296 阅读 · 0 评论 -
C++实现各种插入排序(直接,折半,希尔)
直接插入排序(无哨兵):代码如下:#include <iostream>using namespace std;//数组下标从0开始void InsertSort(int *a, int len){ int j; for (int i = 1; i < len; i++) { if (a[i - 1] > a[i])//优化一下 { int temp = a[i]; for (j = i - 1; a[j] > temp &&a原创 2021-05-22 13:28:36 · 97 阅读 · 0 评论 -
C++ 实现平衡二叉树(AVL树)(完整代码)
#include <iostream>using namespace std;typedef int KeyType;class AVLNode{ friend class AVLTree;public: AVLNode() :lchild(nullptr), rchild(nullptr) {};private: KeyType key; int bf; AVLNode *lchild; AVLNode *rchild;};class AVLTree{pub原创 2021-05-10 22:52:52 · 1180 阅读 · 0 评论 -
平衡二叉树(AVL树)-详解平衡调整
平衡调整:(注意:平衡调整只是平衡调整,没有进行结点的插入)LL型调整:(带阴影的小框表示插入的结点)代码如下:AVLNode *AVLTree::LL_Rotate(AVLNode *a){ AVLNode *b; b = a->lchild; a->lchild = b->rchild; b->rchild = a; a->bf = b->bf = 0; return b;}RR型调整:(带阴影的小框表示插入的结点)代码如下:A原创 2021-05-10 13:20:22 · 221 阅读 · 0 评论 -
二叉排序树(搜索树BST)-详解结点的删除
在二叉排序树中删除一个结点时,需保证删除后的二叉树仍然是二叉排序树。为讨论方便,假定被删除结点为p,其双亲结点为f。删除的过程可按下述的两种情况分别处理。在这里我们用红色三角形表示我们要删除的结点,蓝色表示我们要改变指针的指向,如果蓝色是圆圈,则说明是新根。(1)如果被删除的结点没有左子树,则只需把结点f指向p的指针改为指向p的右子树。情况一:情况二:情况三:(2)如果被删除的结点p有左子树,则删除结点p时,从结点p的左子树中选择结点值最大的结点s(其实就是p的左子树中最右下角的结点,该结原创 2021-05-10 00:08:19 · 1437 阅读 · 0 评论 -
图的最小生成树和最短路径算法思路总结(Prim,Kruskal,Dijkstra,Floyd)
带权无向图—>最小生成树算法—>Prim算法:思路:首先,我们先设置两个集合,U_{}:一个用来放最小生成树的顶点,T_{}:一个用来放最小生成树的边。选取最开始的点V_0,将V_0放入U_{}中,得到U_{V_0},然后从V_0出发的边中选权值最小的,把该边的另外一个点加入集合U中,把边加入集合T中,重复该操作,直到集合U中含图的全部点,最小生成树构造完毕。代码如下:Prim带权无向图—>最小生成树算法—>Kruskal算法:思路:首先,我们先得到该图的最小生成树原创 2021-05-09 21:56:17 · 1111 阅读 · 0 评论 -
C++ 实现二叉排序树(搜索树BST)(完整代码)
#include <iostream>using namespace std;typedef int KeyType;class BinSTreeNode{ friend class BinSTree;private: KeyType key; BinSTreeNode *lchild; BinSTreeNode *rchild; BinSTreeNode() :lchild(nullptr), rchild(nullptr) {};};class BinSTree原创 2021-05-09 00:48:21 · 912 阅读 · 0 评论 -
C++ 实现分块查找(链式存储结构)(完整代码)
#include <iostream>using namespace std;const int INFMIN = -999999;class Node{ friend class IdxTab;public: Node() :next(nullptr) {};private: int w; Node *next;};class IdxNode{ friend class IdxTab;private: int maxk; Node *fidx;}.原创 2021-05-08 20:55:16 · 1000 阅读 · 1 评论 -
C++ 实现分块查找(顺序存储结构)(完整代码)
代码如下:#include <iostream>using namespace std;const int Maxsize = 1000;const int MINNUM = -1e8;class Index_table{ friend class SeqList;private: int key; int address;};class SeqList{//该顺序表从下标为0开始public: ~SeqList() { delete[] elem; .原创 2021-05-07 22:09:21 · 855 阅读 · 0 评论 -
C++ 实现带权有向图的每对顶点之间的最短路径Floyd算法(完整代码)
基本思想是:假设求从顶点vi到vj的最短路径。如果从vi到vj有弧,则从vi到vj存在一条长度为arcs[i][j]的路径,该路径不一定是最短路径,尚需进行n次试探。首先考虑路径(vi, v0, vj)是否存在(判别弧(vi, v0)和(v0, vj)是否存在)。如果存在,则比较(vi, vj)和(vi, v0, vj)的路径长度,取长度较短者为从vi到vj的中间顶点的序号不大于0的最短路径。假如在路径上再增加一个顶点v1,也就是说,如果(vi, …, v1)和(v1, …, vj)分别是当前找到原创 2021-05-07 21:05:01 · 2786 阅读 · 12 评论 -
C++ 实现无向图的最小生成树Kruskal算法(完整代码)
按照Kruskal思想,n个结点的生成树有n-1条边,故反复上述过程,直到选取了n-1条边为止,就构成了一棵最小生成树。实现Kruskal算法的关键问题是:当一条边加入T的边集中后,如何判断是否构成回路。一种解决方法是定义一个一维数组f[n],存放T中每一个顶点所处连通分量的编号。开始令f[i]=i,即图中每个顶点自成一个连通分量。如果要往T的边集中增加一条边(vi, vj),首先检查f[i]和f[j]是否相同,若相同,则表明vi和vj处在同一连通分量中,加入此边必然形成回路;若不相同,则不会形原创 2021-05-07 14:03:15 · 2431 阅读 · 0 评论 -
C++ 实现无向图的最小生成树Prim算法(附完整代码)
实现Prim算法,需设置两个辅助一维数组lowcost和closevertex。其中lowcost用来保存集合V-U中各顶点与集合U中各顶点构成的边中具有最小权值的边的权值;数组closevertex用来保存依附于该边的在集合U中的顶点。过程:假设初始状态时,U={u0}(u0为出发的顶点),这时有lowcost[0]=0,它表示顶点u0已加入集合U中,数组lowcost的其他各分量的值是顶点u0到其余各顶点所构成的直接边的权值。然后不断选取权值最小的边(ui,uk)(ui∈U,uk∈V-U)原创 2021-05-07 11:52:09 · 3842 阅读 · 0 评论 -
C++ class实现十字链表存储的图(完整代码)
代码如下:#include <iostream>#include <queue>using namespace std;typedef int InfoType;typedef int VertexType;const int MaxVertexNum = 30;class ArcNode{ friend class OLGraph; friend class VertexNode;private: int tailvertex, headvertex;原创 2021-05-06 21:31:21 · 282 阅读 · 0 评论 -
C++ class实现邻接表存储的图(完整代码)
代码如下:#include <iostream>#include <queue>using namespace std;const int MaxVertexNum = 30;typedef int InfoType;typedef int VertexType;class Node{ friend class VNode; friend class ALGraph;private: int adjvertex; InfoType info; Node原创 2021-05-06 13:11:58 · 290 阅读 · 0 评论 -
C++ class实现邻接矩阵存储的图(完整代码)
代码如下:#include <iostream>#include <queue>using namespace std;typedef int VertexType;typedef int EdgeType;const int MaxVertexNum = 30;class MGraph{public: MGraph() { CreatGraph(); }; void CreatGraph(); void Visit(int v); void BF原创 2021-05-05 02:15:10 · 460 阅读 · 0 评论 -
C++ class实现Huffman树(完整代码)
代码如下:#include <iostream>using namespace std;const unsigned int n = 8;//字符数NUM,这里的字符数为8const unsigned int m = 2 * n - 1;//结点总数const float MAX = 1e8;class HTNode{ friend class HuffmanTree;private: float weight; int parent; int lchild; ..原创 2021-05-04 21:59:37 · 322 阅读 · 2 评论