数据结构和算法
123.56.119.133:8090
http://123.56.119.133:8090/
展开
-
数据结构二叉树
#pragma once#include #include template struct BinaryTreeNode{ T _data; BinaryTreeNode * _left; BinaryTreeNode * _right; BinaryTreeNode( const T & x)原创 2016-04-24 13:13:49 · 238 阅读 · 0 评论 -
C++实现栈
1.队列#pragma oncetemplatestruct Node{ T _data; Node* _next; Node(const T& x) :_data(x) ,_next(NULL) {}};templateclass Queue{public: Queue() :_head(NULL) ,_tail(NULL) ,_size(0)原创 2016-04-08 00:55:38 · 396 阅读 · 0 评论 -
C++实现队列
队列:队列具有先进先出的特性。队列用链表实现较好,因为数据的插入和删除一个在尾上操作,一个在头上操作。用链表较方便。#pragma oncetemplatestruct Node{ T _data; Node* _next; Node(const T& x) :_data(x) ,_next(NULL) {}};templateclas原创 2016-04-10 09:50:37 · 372 阅读 · 0 评论 -
实现一个栈,要求Push/Pop/Min(返回最小值)的时间复杂度为O(1)
题目:实现一个栈,要求Push/Pop/Min(返回最小值)的时间复杂度为O(1)#pragma once #include//实现一个栈,要求实现Push/Pop/Min(返回最小值)的时间复杂度为O(1)//栈的入栈和出栈操作本来就是时间复杂度为O(1),但是要求返回Min(最小值)//也是O(1)的算法,这就有些难度了,题目中 只要求了时间复杂度为O(1),但原创 2016-07-04 19:09:34 · 591 阅读 · 0 评论 -
两个栈实现一个队列
//两个栈实现一个队列//栈的性质是后进先出,队列的特点是先进先出,如果用两个栈实现队列,就要//注意他们之间性质的差别,#includetemplate class CQueue{public: void appendtail(const T& node) { stack1.push(node);//全部都push到stack1 } T deleteHead() {原创 2016-07-05 12:01:22 · 212 阅读 · 0 评论 -
判断元素入栈/出栈的合法性
判断元素入栈 出栈的合法性:验证进栈出栈的合法性---每次取栈顶元素,因为出栈的时候先进后出,每次出栈的总是栈顶元素,栈顶元素和另一个数组进行对比,如果相等就pop//判断元素入栈 出栈的合法性//验证进栈出栈的合法性---每次取栈顶元素,因为出栈的时候先进后出,每次出栈的//总是栈顶元素,栈顶元素和另一个数组进行对比,如果相等就pop#include#incl原创 2016-07-06 14:05:41 · 382 阅读 · 0 评论 -
利用栈解决迷宫问题
#pragma once #include#include#define N 10struct Position{ int _row; //行 int _col; //列 Position(int row,int col) :_row(row) , _col(col) {}};templatebool SearchMazePath(int* a, int原创 2016-04-12 23:15:49 · 1199 阅读 · 1 评论 -
数据结构_对称矩阵
#pragma once//对称矩阵templateclass SymmetricMatrix{public: SymmetricMatrix(T* a,size_t size) :_a(new T[size*(size+1)/2]) , _size(size*(size+1)/2) , _n(size) //方便以后用作出书打印 { size_t index =原创 2016-04-16 21:39:45 · 2469 阅读 · 0 评论 -
数据结构-稀疏矩阵
稀疏矩阵:矩阵中有效数据的个数远远小于无效数据的个数,则可以称之为稀疏矩阵如果还像以前那样将每个稀疏矩阵的数据都存储起来,则会造成内存的很大程度的浪费,所以应用特别的存储方式。稀疏矩阵的压缩存储:使用{row,col,value}三元组存储每一个有效数据,三元组按原矩阵中的位置,以行优先级先后顺序依次存放。矩阵的转置:将矩阵上行列互换,原来的A[i][j]就等于现在的A原创 2016-04-18 11:22:42 · 551 阅读 · 0 评论 -
数据结构-堆
#pragma once #include#includetemplateclass Heap{public: Heap() :_a(NULL) {} Heap(const T* a,int size) { _a.reserve(size); for (int i = 0; i < size; i++) { _a.push_back(a[i]);原创 2016-04-25 10:20:54 · 189 阅读 · 0 评论 -
ZIP压缩算法详细分析及解压实例解释
最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据压缩,两者本质上没啥区别,在数学家看来,都是映射。一方面在进行通信的时候,有必要将待传输的数据进行压缩,以减少带宽需求;另一方面,计算机存储数据的时候,为了减少磁盘容量需求,也会将文件进行压缩,尽管现转载 2016-08-27 23:33:50 · 1429 阅读 · 0 评论 -
红黑树
前言: 红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black。通过对任何一条从根到叶子简单路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡。红黑树的基本概念: 红黑树是满足下面红黑性质的二叉搜索树1. 每个节点,不是红色就是黑色的2. 根节点是黑色的3. 如果一个节点是红转载 2016-08-31 11:20:48 · 242 阅读 · 0 评论 -
数据结构-堆排序
#pragma once #include#includetemplateclass Heap{public: Heap() :_a(NULL) {} Heap(const T* a, int size) { _a.reserve(size); for (int i = 0; i < size; i++) { _a.push_back(a[i]);原创 2016-04-26 20:35:38 · 359 阅读 · 0 评论 -
递归实现栈中元素的逆置
题目:一个栈依次压入1,2,3,4,5那么从栈顶到栈底分别为5,4,3,2,1。将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现了栈中元素的逆序,请设计一个算法实现逆序栈的操作,但是只能用递归函数来实现,而不能用另外的数据结构。给定一个栈Stack以及栈的大小top,请返回逆序后的栈。测试样例:[1,2,3,4,5],5返回:[5,4,3,2,1]原创 2016-07-13 10:42:57 · 989 阅读 · 0 评论 -
HashTable
#pragma once //直接定址法:利用公式enum Status//状态{ EXIST,//存在 DELETE,//删除 EMPTY,//空};templateclass HashTable{public: HashTable()//无参 :_tables(0) , _status(0) , _size(0) , _capacity(0) {}原创 2016-07-12 20:46:26 · 223 阅读 · 0 评论 -
栈的应用-后缀表达式
我看的是殷人昆版的《数据结构》,在栈的应用中,介绍了后缀表达式,下面由我为大家稍微说明下后缀表达式的定义.后缀表达式:也叫RPN或逆波兰表达式。它是中缀表达式的替代形式。参加运算的操作数总在操作符前面。例如:中缀表达式 A+B*(C-D)-E/F 对应的后缀表达式为:ABCD-*+EF/-详细的后缀表达式的过程如上图所示, 利用栈的特性生成后缀表达式。//后缀表达原创 2016-04-13 10:45:39 · 789 阅读 · 0 评论 -
数据结构-堆的应用-海量数据
#define _CRT_SECURE_NO_WARNINGS 1//海量数据#includeusing namespace std;#include#includeconst int N = 10000;const int K = 100;//创建数据void GetData(vector&Money,const int N){ srand(time(0)); //设原创 2016-04-26 20:33:46 · 214 阅读 · 0 评论 -
记数排序
记数排序思路:首先遍历一遍,找到最大和最小的数,利用最大和最小开辟空间,记为tmp.然后统计各个数字出现的次数,利用出现的次数,遍历tmp,根据出现的次数,重新写入数组a中//计数排序void CountSort(int* a, int size){ assert(a); int max = a[0]; int min = a[0]; for (int i =原创 2016-05-24 23:48:31 · 261 阅读 · 0 评论 -
基数排序
基数排序思路:类似于快速转置的快速定位方法,利用上一个的开始位置和个数进行计算下一个的位置。利用额外空间进行排序。//基数排序//LSD-- Least Significant Digit firstint GetMaxDigit(int* a, int size){ int Digit = 1; int max = 10; for (int i = 0;原创 2016-05-25 23:07:35 · 213 阅读 · 0 评论 -
数据结构-广义表
广义表(Lists,又称列表)是一种非线性的数据结构,是线性表的一种推广。它被广泛的应用于人工智能等领域的表处理语言LISP语言中。在LISP语言中,广义表是一种最基本的数据结构,就连LISP 语言的程序也表示为一系列的广义表。因为表中有表,所以可以用递归进行解决广义表的问题。#pragma once #includeenum Type{ HEAD原创 2016-04-19 17:47:13 · 353 阅读 · 0 评论 -
数据结构-使用两个栈实现一个队列
1.使用两个栈实现一个队列思路一:假设一个s1是栈的s2是出栈的入队时,直接先把s1是入栈的,s2是出栈的。入队时,直接压到s1即可。出栈时,把s1的元素全部倒入s2中,然后弹出s2的栈顶元素。然后再把s2的元素全部倒入s1中。缺点:每次弹出一个数据后,都要把s2的数据再倒入s1中,来回挪动两次数据,比较麻烦。思路二:入队列:直接压入元素至s原创 2016-04-13 10:19:08 · 433 阅读 · 0 评论 -
STL_Iterator
迭代器iterator是一个很神奇的东西。STL的中心思想在于:将数据容器和算法分开,彼此独立设计,最后再以胶合剂(iterator)将他们撮合在一起。#pragma once#include#include#include#includevoid TestVector(){ vector v; v.push_back(1); v.push_b原创 2016-06-25 14:19:06 · 216 阅读 · 0 评论 -
红黑树和AVL树的比较
1. 红黑树并不追求“完全平衡”——它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。 红黑树能够以O(log2 n) 的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构,能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。红黑树的算法时间复杂度和AVL相同,转载 2016-06-12 11:41:05 · 351 阅读 · 0 评论 -
二叉树线索化
#pragma onceenum PointerTag { THREAD, LINK };template struct BinaryTreeNodeThd{ T _data; // 数据 BinaryTreeNodeThd* _left; // 左孩子 BinaryTreeNodeThd* _right; // 右孩子原创 2016-07-10 19:57:36 · 190 阅读 · 0 评论 -
快速排序QuickSort
题目:快速排序//挖坑法#includeusing namespace std;#includeint Single(int *arr, int left, int right){ assert(arr); int tmp = arr[right]; //tmp作为坑 while (left < right) // { while (lef原创 2016-06-29 19:06:26 · 220 阅读 · 0 评论 -
归并排序
#includeusing namespace std;#includevoid SinglePartSort(int* tmp, int* a, size_t start, size_t mid, size_t end){ assert(tmp); assert(a); size_t i = start, j = mid + 1, k = start; while (i <=原创 2016-06-30 18:23:29 · 181 阅读 · 0 评论 -
两个队列实现一个栈
templateclass Stack{public: bool Empty() { return _q1.empty() && _q2.empty(); } void Push(const T& x) { _q1.push(x); } void Pop() { assert((!原创 2016-08-26 09:40:24 · 193 阅读 · 0 评论