C++数据结构与STL
文章平均质量分 71
learn123_net
http://learn123.net There are lots of products in the market that make you dazzled and you dont know how to make a choice. In here we introduce the latest fashion and popular treands. Therefore you learn it first,and then buy the goods that you bes
展开
-
C++数据结构--循环队列的实现
1.循环队列模型与数组视图的对照 2.实现代码: const int MAX=3; //循环队列的固定长度 templateclass myQue{private:T que[MAX];size_t front_index;//队首下标 size_t back_index; //队尾下标 size_t lengt原创 2013-07-29 13:50:04 · 1438 阅读 · 0 评论 -
C++数据结构与STL--栈的应用--后缀表达式的计算
1.后缀表达式:运算符出现在其运算数之后 Example: 中缀:a+b*c 后缀:abc*+ 中缀:(a*b+c)/d+e 后缀:ab*c+d/e+ 2.后缀表达式计算 *从左到右扫描后缀表达式的每一项,用一个栈装载运算数,如果是运算数将其推入栈 *如果是二元运算符,则出原创 2013-07-28 17:52:27 · 1246 阅读 · 0 评论 -
C++数据结构--队列的应用--基数排序
Example:对数组91,6,85,15,92,35,30,22,39进行基数排序对个位进行排序后,10个队列中记录如下图从所有队列中依次收集元素得到:30 91 92 22 85 15 35 6 39对十位进行排序后,10个队列中记录如下图从所有队列中依次收集元素得到:6 15 22 30 35 39 85 91 92原创 2013-07-29 15:31:32 · 2163 阅读 · 0 评论 -
C++数据结构--.哈希表线性探测开放寻址法与独立表链地址法
1.哈希函数是个定位函数,它用键作为参数,返回表中的索引值 2.线性探测开放寻址法 *调用哈希函数处理键得到哈希值,用值除以表的长度后取余数,从而确定表中的一个位置 *如果该位置非空,则探测下一个位置,到达表最后一项时,折回表头。 *如果回到原来哈希位置上时还未找到空闲位置,说明表已经填满了。 例如:hash(key)=key%11原创 2013-08-05 13:54:01 · 4221 阅读 · 0 评论 -
C++数据结构--.哈希表独立表链地址法迭代器的设计
1.哈希表独立表链地址法中迭代器的设计 *hashTable:哈希表对象的地址 *currentBucket:迭代器遍历的当前桶的索引 *currentLoc:当前哈希表元素 例如:虚线为遍历元素顺序 实现代码: Tips: 可以把哈希表独立表链地址法的结构看成二维数组 #ifndef hashIt原创 2013-08-05 13:53:54 · 1479 阅读 · 0 评论 -
STL模板类的继承
1.STL模板类的继承符合普通的继承规则 *STL提供的模板类有时并不符合需求,例如,vector类并没有提供下标越界检测。这时便可以通过简单的继承,达到目的。 Example:#include #include#include using namespace std;templateclass myVector:public vec原创 2013-08-06 16:12:54 · 1760 阅读 · 0 评论 -
C++数据结构--用向量数组实现大(小)根堆的插入和删除
1.基于数组的二叉树 例如,可以用向量数组{5,1,3,9,6,2,4,7,0,8}表示下图的完全二叉树 Tips: 对于结点v[i],可利用下列公式计算其子结点和父结点 左结点:v[2*i+1] 右结点:v[2*i+2] 父结点: v[int((i-1)/2] v[(i-1)/2] 因为i为整数2.大根堆:父结点总是大于或等于它的原创 2013-08-07 09:50:01 · 1860 阅读 · 0 评论 -
C++数据结构--堆排序
popHeap() ,adjustHeap()详见 C++数据结构--用向量数组实现大(小)根堆的插入和删除1.对已经堆化的数组进行堆排序 2.向量堆化 堆化前的向量数组v{9,12,17,30,50,20,60,65,4,19} 堆化过程示意图 实现代码:#include原创 2013-08-08 10:08:50 · 907 阅读 · 0 评论 -
C++数据结构--归并排序
1.归并算法图解 Example:对向量数组v{...,7,10,19,25,12,17,21,30,48,...}进行局部归并 step1: step2-step3 step4-step8 step9 2.归并排序 Example:对向量数组v{25,10,7,19,3,48,原创 2013-08-08 13:23:34 · 766 阅读 · 0 评论 -
C++语法基础--istream,流状态及其影响,get(),getline(),ignore()
1.cin对象将标准输入表示为字节流。2.istream类重载了抽取运算符>>,使其能够识别基本类型数据。 *hex,oct,dec控制符可以和cin一起使用,来指定将整数输入解释为十六进制,八进制,十进制 Example: int main(){ int x; cin>>hex>>x; //f cout//15 return原创 2013-08-10 09:36:19 · 2695 阅读 · 0 评论 -
C++数据结构--全排列
1.排列 n个元素的全排列种数等于n! Example:4个元素的所有24个排列 可以使用树来设计排列的递归算法,从第一层结点到叶子节点的路径对应着一个排列,如下图阴影部分 每个排列就是有n个元素的向量 步骤: 下标0:使用迭代过程从原来的那个向量生成4个新的向量,方法是将索引范围[0,4)中的每个元素与索引值为0的元素原创 2013-08-10 12:26:33 · 832 阅读 · 0 评论 -
C++数据结构--自顶向下和自底向上的动态编程思想
1.自顶向下的动态编程 Example:计算组合数 组合定义: 从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合; 从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数.用符号c(n,m) 表示. 推导: 从M个元素中任意指定一个元素。则选出N个的方法中,包含这一个元素原创 2013-08-10 16:07:27 · 1162 阅读 · 0 评论 -
C++数据结构--快速排序
1.对向量数组v{800,150,300,650,550,500,400,350,450,900}进行快速排序,索引[first,last)=[0,10) *将v的元素划分为两个子表s1和S2,子表S1的元素都=中心值 step1:取pivot=v[mid]=v[5]=500,作为中心值,并与v[first]交换,其中mid=(first+last)/2 整数原创 2013-08-09 18:43:15 · 890 阅读 · 0 评论 -
C++数据结构--组合学--查找集合的所有子集
1.查找所有子集 对于集合S,如果S有n个元素,则它有2的n次方个子集 问题求解步骤: *假设S有n个元素,从S中删除元素x,剩下n-1个元素构成一个新的集合S1,则S1有2的n-1次方个子集. *将元素x加入S1中的每个子集中,这样就产生了新的2的n-1次方个子集,这些新子集和S1构成了集合S的所有子集 Example:对于集合S{1,2,3}原创 2013-08-10 08:54:19 · 2256 阅读 · 0 评论 -
C++数据结构--动态编程
1.动态编程 当分而治之算法划分的子问题不是相互独立时,直接的递归实现会因为子问题相互重叠导致惊人的多余计算和函数调用,甚至为指数递增 Example:用递归实现斐波那契序列 实现代码: int fib(int n){if(n return n;else return fib(n-1)+fib(n-2);}原创 2013-08-10 14:22:26 · 848 阅读 · 0 评论 -
C++数据结构--背包问题
1.背包问题是最优化问题的一个具体例子 问题可以描述为: 给定一组物品,每种物品都有自己的大小和价格,在限定的总大小内,我们如何选择,才能使得物品的总价格最高。 背包问题有几个版本,这里只研究0/1版本,即需要作出决策来选择(1)或抛弃(0)集合中的一个物品。 Example:给出5个物品,背包容量为12 问题求解过程图解 矩阵原创 2013-08-11 09:49:02 · 1086 阅读 · 0 评论 -
C++数据结构--回溯算法--八皇后问题
1.回溯算法: 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法Example:八皇后问题在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。对于方格(ROWi,COLj)内的皇后,可对其攻击的皇后位置坐标(row,col)满足上对角线: col+row原创 2013-08-12 10:29:10 · 6886 阅读 · 0 评论 -
C++数据结构——埃拉托斯特尼筛法以及求集合的交集,并集,差集
1.放入集合中自定义的类通常需要重载==和2.集合存储指定类型的键,且不允许有重复的键3.STL set类迭代器按照递增顺序遍历元素4.集合的应用:埃拉托斯特尼筛法--找出小于等于n的所有素数 *从整数m=2(m=2)的元素 实现代码: template//找出小于等于n的所有素数set sieve(int n){set原创 2013-08-04 01:20:10 · 1529 阅读 · 0 评论 -
C++数据结构与STL--栈的实现
template//适配器类class myStack{private:vector st;//向量对象public: myStack():st(0)//创建一个空栈 { } void push(T val) //入栈 { st.push_back(val); } void原创 2013-07-28 17:44:38 · 721 阅读 · 0 评论 -
C++数据结构与STL--栈的应用--中缀表达式转后缀表达式
1.输入优先等级和栈优先等级定义:目的,解决右结合表达式问题,例如2^2^2为右结合表达式2.累计等级与无效表达式分析: 3.使用栈处理相同或较低优先级的运算符 Example:a*b/c+d 4.处理右结合表达式运算符^ Example:a^b^c 5.处原创 2013-07-28 21:32:05 · 1219 阅读 · 1 评论 -
C++数据结构--单向循环链表(实现头插法,尾插法)
单向循环链表核心代码图解:*插入到非空链表的表尾*删除非空链表元素实现代码:并未包括异常类处理templateclass sinCirLink{private:class node //节点类型 {public:node():val(T()),next(nullptr){}node(T v)原创 2013-07-30 16:29:58 · 4807 阅读 · 0 评论 -
C++数据结构--循环链表的应用--解决约瑟夫问题
解决问题过程图解实现代码://n个竞争者,每隔m个竞争者就淘汰一个 //返回值为胜出的竞争者 int josephus(int n,int m){list lst;for(int i=1;i //给[1,n]个竞争者编号 {lst.push_back(i);} coutfor(int x:lst){cout原创 2013-07-31 10:25:24 · 1357 阅读 · 0 评论 -
C++数据结构--二叉树的前序遍历,中序遍历,后序遍历
1.二叉树的抽象模型和相应的node对象表示 2.遍历二叉树 Example:对下图给出的二叉树进行前,中,后序遍历结果 本示例所用到的二叉树 实现代码:templateclass node{ public: T val; //节点值原创 2013-08-01 08:14:47 · 2550 阅读 · 0 评论 -
C++数据结构--二叉树的复制和删除
本示例所用到的二叉树:templateclass node{ public: T val; //节点值 node* left;//左节点 node* right;//右节点 node():val(T()),left(nullptr),right(nullptr){} node(T v, node* l=nullptr,原创 2013-08-01 08:40:54 · 4351 阅读 · 0 评论 -
C++数据结构--按层次遍历二叉树
1.按层次遍历二叉树图解 示例所用到的二叉树:实现代码:#include#includeusing namespace std;template//节点类class node{ public: T val; //节点值 node* left;//左节点 no原创 2013-08-01 08:22:20 · 6628 阅读 · 0 评论 -
C++数据结构--计算二叉树叶子数和深度
1.示例二叉树 2.计算二叉树深度: *先计算左右子树的深度,然后整棵树的深度就是左右子树深度较大值加1 *递归遍历结束条件:定义空树的深度为-1,于是得到叶子节点的深度计算公式 Depth(叶节点)= 1 + max(depth(左子树),depth(右子树)) = 1 + ma原创 2013-08-01 08:31:57 · 6406 阅读 · 1 评论 -
C++数据结构与STL--选择排序
注:本系列笔记来源于:C++数据结构与应用标准模板库(虽是10年前出版的,个人认为还可以,于是整理数据结构的知识时选了它)1.使用选择排序排序整数数组50,20,40,75,35 *外部循环对表进行n-1次遍历。pass控制变量的范围0-n-2 *对于每次重复过程,都有一个内部循环扫描arr[pass]到arr[n-1]的无序子表,并判定最小元素的下标。 *只有最小元素的下标原创 2013-07-25 21:23:06 · 720 阅读 · 0 评论 -
C++数据结构与STL--二分查找
给出数组int arr[]={-7,3,5,8,12,16,23,33,55};*查找target=23#includeusing namespace std;template//查找成功则返回元素下标,否则返回-1 //数组查找下标范围[begin,last) //此二分查找算法要求数组中的元素已经按从小到大排序 int binarySearc原创 2013-07-25 21:45:50 · 948 阅读 · 0 评论 -
C++数据结构--递归--最大公约数,斐波那契数
1.最大公约数公式: int gcd(int a,int b){if(b==0){return a;} gcd(b,a%b); }int main(){ cout//6 return 0;}2.斐波那契数 定义: *递归版本 int原创 2013-07-26 09:46:20 · 830 阅读 · 0 评论 -
C++数据结构与STL--递归--汉诺塔
实现代码://n代表盘子的数目,init代表盘子所在的初始化杆,//des代表盘子移向的目的杆,tem代表交换时的临时辅助杆void hanoi(int n,string init,string tem,string des){ if(n==1) { cout" return; } hanoi(n原创 2013-07-26 08:47:20 · 760 阅读 · 0 评论 -
C++数据结构与STL--递归--进制转换
Tips:用C++函数实现递归时,程序把函数参数和函数的返回地址推入运行栈,入栈和出栈操作指导函数的执行// 该算法适用于base的范围[2,10] void displayInBase(int n,int base){ if(n==0) { return ; } displayInBase(n/base,base);原创 2013-07-26 08:07:02 · 1044 阅读 · 0 评论 -
C++数据结构——二叉搜索树(实现自定义迭代器)
1.二叉搜索树抽象模型和相应的node对象表示 2.从二叉搜索树删除一个节点 (1)如果是叶子节点就直接删除 (2)被删除的节点有左节点,但没有右节点,则将左节点连接到父节点上,例如删除下图节点35 (3)被删除的节点有右节点,但没有左节点,则将右节点连接到父节点上,例如删除下图节点26原创 2013-08-02 18:00:10 · 1760 阅读 · 0 评论 -
C++数据结构--栈的应用--进制转换
1.栈具有后进先出的访问方式 栈顺序存储元素,但仅允许在序列的一端插入和删除数据项 Example:A B C D的进栈和出栈 2.栈的应用:进制转换 Example:把十进制431转换为16进制 实现代码: string convert(int num,int base){ string char_num("0123456789ABCDEF");原创 2013-07-27 16:24:32 · 1353 阅读 · 0 评论 -
C++数据结构--插入排序
*在进行第i遍时,[0 ,i-1]范围内的元素已经排序完毕 *第i遍的任务时通过扫描以前已分类的子表,给vec[i]在[0,i]的子表范围内找到正确的位置 *插入排序并不需要额外的辅助空间,只是在原数组上进行排序例如,对字符串数组Monroe,Chin,Flores,Stein,Dare进行插入排序实现代码:templatevoid原创 2013-07-26 18:27:32 · 650 阅读 · 0 评论 -
C++数据结构与STL--有序表,删除表重复项
1.有序表 算法过程模拟:假设intList最初包含整数60,65,74,82 curr=intList.begin() 在表中插入50: 在表中插入70 实现代码 template//假设容器为listvoid insertOrder(list& lst,T val){ auto beg=lst.begin原创 2013-07-27 15:19:14 · 2884 阅读 · 1 评论 -
C++数据结构——二叉搜索树迭代器的实现
1.二叉搜索树迭代器的中序遍历遍历 2.迭代器的++指向中序遍历的下一个节点 *如果右子树不空,则移动到右子树,并沿着左边向下,直到当前节点的左指针为空,例如12的下一节点14 *如果右子树为空,则沿着父指针链向上查找,直到找到以当前节点作为左子结点的父节点,例如23的下一节点25 特殊情况: (1)沿着父指针链向上查找原创 2013-08-02 17:34:45 · 2205 阅读 · 0 评论 -
C++数据结构与STL--双向循环链表(实现自定义iterator类)
双向循环链表核心代码图解:节点类#ifndef node_H#define node_Htemplateclass node{public:node *pre; //上一节点指针node *next;//下一节点指针T val;node():val(T()),pre原创 2013-07-31 01:39:10 · 3521 阅读 · 0 评论