![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构(C++实现)
phoenix_te
努力转行中
展开
-
stack
stack.h#define STACK_INIT_SIZE 2#define STACK_INCREMENT 2typedef int elementype;class Stack{public: elementype *base,*top; int size; //已分配空间 Stack(); void Push(elementype x); //插入数据 eleme...原创 2018-03-03 10:28:03 · 116 阅读 · 0 评论 -
bellman-ford算法
bellman-ford算法是用于解决单源最短路径的算法,与Dijkstra不同的是,它可解决存在负权边的的情况。同时,它也可以检测是否存在存在负权值环。其基本思路如下:建立一个距离数组dis[],将源点设为0,其余点的距离初始化为无穷大。将下列操作循环最多n-1次:对于每条边,start->end,if(dis[end] > dis[start] + weight) ...原创 2018-05-14 15:22:00 · 177 阅读 · 0 评论 -
二叉树遍历
#include <iostream>#include <queue>using namespace std;class Node{public: int data; Node *left; Node *right; Node(int aData) { this->data = aData; ...原创 2018-05-06 14:52:53 · 142 阅读 · 0 评论 -
Floyd算法
Floyd算法用于求图中任意两点的最短距离。Floyd算法的内涵是遍历N个结点,对于第k个结点,将k结点作为中间结点,更新其余结点的信息:即其余结点(i)能否通过结点k来缩短与其他结点(j)的距离。Floyd的代码写起来非常简洁,但一直有一个小问题会困惑,假设i-j的最短距离中,以k结点更新最短距离时,如果此时i-k和k-j不是最短距离,如何保证i-j是最短距离呢?假设i-j最短距离中,编号最大的...原创 2018-05-12 10:23:34 · 295 阅读 · 0 评论 -
Dijkstra 算法的几种变形
Dijkstra用来就最短路径,在保证最短路径的条件下,可新增一些其他标尺。1.每个结点拥有点权,在最短路劲的条件下求点权和最大的路劲。2.每条边新增边权cost,在最短路径的条件下求cost和最小的路径。3.求最短路径的条数。问题1,3可参考我的另一篇文章:https://blog.csdn.net/qq_39304201/article/details/80176476关键是建立num数组与m...原创 2018-05-04 20:48:07 · 1037 阅读 · 1 评论 -
贪心策略之Dijkstra算法
Dijkstra算法是解决有向带权图中最短路径的算法。我用自己的语言解释Dijkstra算法的过程:1.首先有一个有向带权图G=(V,E),V为顶点集合,E为边集合,用邻接矩阵map[n][n]来储存。 确定一个起始点origin,有一个辅助集合s,一开始将origin并入s中。 有一个辅助数组dist[n],dist[i]表示i距离origin的最短距离,初始化dist[i]=map...原创 2018-04-13 23:19:49 · 2744 阅读 · 0 评论 -
单链表实现多项式相加
首先用两个单链表储存两个多项式,要求输入的时候按指数降序输入。新建一个单链表res;接着从两个单链表的头部开始比较;如果指数不相同,将指数较大者接在res后面,同时res链表与较大者链表的游标向后移动,并且令res游标(此时指向刚刚接上的结点)的next域为空。这个过成相当于从原单链表中直接夺取了一个结点。如果指数相同,分两种情况。1.相加后系数为0.直接令两个原多项式的游标向后移动一格,其余什么...原创 2018-04-21 17:51:50 · 1127 阅读 · 0 评论 -
快速排序
快速排序思想如下:将一串序列中某一项作为基础pivot,将小于pivot的元素移到pivot的左侧,将大于pivot的元素移到右则,这样就得到了以pivot的基准的两串子序列,对子序列也做如此排序。这里也是用到了分治的策略,先分解再合并。快速排序分解是难点。以位置low的元素为基准,设置两个游标i=low,j=high。先从右往左扫描,遇到小于pivot的元素,则p[i],p[j]交换.i++。此...原创 2018-04-19 17:08:27 · 126 阅读 · 0 评论 -
归并排序
归并排序是一种分治策略。将一串序列从中间分开,分为low-mid,mid+1-high两部分子序列。这是分解。将子序列排序,并把排序后子序列重新复制给原数组。这是合并。对子序列不断递归调用,直到子序列个数为1。数量为1不再排序,直接将该数赋值给原数组。例如一个序列 n=101 3 9 0 5 8 4 2 7 6分解过程:1. 1-3-9-0-5 , 8-4-2-7-6 ...原创 2018-04-18 22:57:58 · 98 阅读 · 0 评论 -
Prim算法
Prim算法是用来求带权无向图中的最小生成树。我对其解释如下:1.对于带权无向图G=(V,E)。有一集合s,开始时从图中任选一点origin并入s中,origin即为起点。2.选取一条弧<j,k>,顶点j属于s中,顶点k属于V-s中,并且<j,k>的权值为可选的边中的最小的。3.将顶点k并入s中。4.重复2-3,直到s包含了所有顶点(或已经执行了n-1次)在算法中,主要是使...原创 2018-04-14 16:54:08 · 198 阅读 · 0 评论 -
哈夫曼树的构造
哈夫曼树是叶子节点带权路径最小的二叉树。其构造方法我个人理解如下:对于给定的n个结点,其权值为Ni,将n个结点并入集合S中,对于n个结点按权值大小从小到大排列,每次从集合中取出权值最小的两个结点,将他们作为一个新结点的左右子树,新结点的权值为两结点之和,将新结点并入S中,重复操作,直至S中只有一棵树。利用C++,优先队列实现哈夫曼树的构造,在这里用优先队列储存结构体指针,在实现从小到大排序时略麻烦...原创 2018-04-14 15:37:43 · 820 阅读 · 1 评论 -
单链表
node.htypedef int elementype;class Node{public: elementype data; //当前数据 Node *next; //下一结点地址};linklist.h#include "node.h"#include <iostream>class linklist{public: Node Header; ...原创 2018-02-25 18:36:57 · 128 阅读 · 0 评论 -
顺序表
sqlist.h#include<iostream>#define INIT_SIZE 5#define INCREMENT 10typedef int elementype;class sqlist{public: elementype *base; //头地址 int length; //表长(包含元素数量) int size; //当前已有长度 ...原创 2018-02-25 18:33:54 · 105 阅读 · 0 评论 -
queue
node.htypedef int elementype; class Node { public: elementype data; //当前数据 Node *next; //下一结点地址 }; queue.h#include "node.h"class Queue{private: Node *fr...原创 2018-03-03 11:53:48 · 98 阅读 · 0 评论 -
图的遍历
这里写的是无向图的遍历方法,BFS与DFS。BFS主要是借助了一个队列q,开始时将根结点压入队列,并标记为已访问,当队列不为空时做以下循环:1.输出队首结点2.取队列队首元素,遍历n个结点,如果队首结点与该结点有边且该结点为被访问,将该结点压入队列中,并标记该结点。DFS则是利用递归思想,需要在函数体外建立一个visit[n+1]数字。对于结点i,访问结点i,并标记结点i已访问遍历n个结点,如果结...原创 2018-05-07 22:38:01 · 457 阅读 · 0 评论