数据结构和算法
文章平均质量分 69
Henryinferno
这个作者很懒,什么都没留下…
展开
-
由前序和中序遍历建立二叉树并后序遍历输出二叉树
#ifndef STACK_H_INCLUDED#define STACK_H_INCLUDED#define MAX 20typedef struct tnode{ char data; struct tnode *lchild; struct tnode *rchild; int rvisit; //rvisit==1表示该节点在后序遍历时已被访问原创 2013-08-24 17:49:13 · 1155 阅读 · 0 评论 -
《算法》第一章——数组的局部最小元素
题目和思路:题意是指当a[i]的前后两个元素都存在时,需要满足“a[i] 但是如果a[i]是第一个元素或者是最后一个元素,那么只需要看一边。所以对于任何一个数组,”局部最小元素“一定是存在的,题意要求找一个就行,于是就用二分了。代码:#include using namespace std;static const int N = 5;int local_min(i原创 2016-11-04 21:01:45 · 2379 阅读 · 1 评论 -
《算法》第一章——仅用加减实现的二分查找
仅用加减实现的二分查找算法叫斐波那契查找。算法的大致思路参考:http://blog.csdn.net/zsw12013/article/details/50003505——斐波那契查找(黄金分割法查找)(仅使用加减实现的二分查找)代码:#include #include using namespace std;class FibonacciSearch{publi原创 2016-11-05 16:42:16 · 583 阅读 · 0 评论 -
《算法》第一章——判断两个整数是否互质
判断两个整数互质的方法 概念:公约数只有1的两个数叫做互质数。根据互质数的概念可以对一组数是否互质进行判断。如:9和11的公约数只有1,则它们是互质数。求商判断法:用大数除以小数,如果除得的余数与其中较小数互质,则原来两个数是互质数。如:317和52,317÷52=6……5,因余数5与52互质,则317和52是互质数。#includeusing namespace std原创 2016-10-28 19:01:58 · 15909 阅读 · 4 评论 -
《算法》第一章——Dijkstra双栈表达式求值
思路:使用两个栈分别保存运算符和操作数。将表达式从左到右依次送人栈中处理:将操作数压人操作数栈。将运算符压人运算符栈。忽略左括号。若遇到右括号,则弹出一个运算符,并弹出所需的操作数,并将这部分表达式的运算结果求出后压人操作数栈。处理完所有右括号后,操作数栈中的最后一个指就是表达式的值。#include#include#include#includeusing nam原创 2016-10-29 09:46:21 · 462 阅读 · 0 评论 -
《算法》第一章——中缀表达式转前缀和后缀表达式
思路:参考中的文章已经将思路讲的非常详细了。中缀转前缀:(1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2;(2) 从右至左扫描中缀表达式;(3) 遇到操作数时,将其压入S2;(4) 遇到运算符时,比较其与S1栈顶运算符的优先级:(4-1) 如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈;(4-2) 否则,若优先级比栈顶运算符的较高或相原创 2016-10-29 22:50:47 · 330 阅读 · 0 评论 -
《算法》第二章——归并排序实现,快速归并,间接(索引)归并
#include#include#define N 5using namespace std;int aux[N];//辅助数组void merge(int a[],int lo,int mid,int hi){//将a[lo..mid]和a[mid+1..hi]归并 int i = lo; int j = mid + 1; for (int k = lo; k <=hi;原创 2016-11-12 15:13:26 · 393 阅读 · 0 评论 -
《算法》第一章——约瑟夫环(Josephus)问题
问题简述:N个人围成一圈(位置记为0~N-1),从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=7,M=2,被杀掉的顺序是:1,3,5,0,4,2,6。思路:主要有两种方法:队列和循环链表发。这里用队列法。首先每当一个人刚报过数了,不考虑被杀死的情况,那么这个人是下一轮中最后一个需要报数的,也就是排在队尾的那个。所以每次报数后应该将这个人从队首po原创 2016-11-01 18:33:57 · 577 阅读 · 0 评论 -
《算法》第一章——打印文件目录结构
转载自:http://blog.csdn.net/nbda1121440/article/details/9120219-------Linux打印文件目录结构代码:#include #include #include #include #include #include void printdir(char *dirname,int indent){ DIR *dp;转载 2016-11-01 20:16:50 · 553 阅读 · 0 评论 -
《算法》第一章——栈的可生成性
转自:http://blog.csdn.net/wangyl_gain/article/details/50449318------数据结构01--栈题目:用例程序会进行一系列入栈和出栈的混合操作。入栈操作会将整数0-9顺序压入栈中,判断出栈顺序是否正确。 例如:入栈: 0- 1- 2- 3- 4- 5- 6- 7- 8- 9出栈:4- 3 -2- 1 -0- 9 -8转载 2016-11-01 21:52:05 · 880 阅读 · 1 评论 -
《算法》第一章——利用两个栈实现一个队列的push和pop操作
思路方法参考:http://www.cnblogs.com/wanghui9072229/archive/2011/11/22/2259391.html-------用两个栈实现一个队列——我作为面试官的小结代码:#include#includeusing namespace std;templateclass MyStack{public: void pop()原创 2016-11-02 15:02:33 · 1296 阅读 · 0 评论 -
《算法》第二章——生成快排的最佳序列
题目:Best case. Write a program QuickBest.java that produces a best-case array (with no duplicates) for Quick.sort(): an array of N distinct keys with the property that every partition will produce原创 2016-11-26 13:06:03 · 787 阅读 · 0 评论 -
《算法》第三章——二叉查找树中的递归
如果给定的键key小于二叉查找树的根节点的键,那么小于等于key的最大键floor(key)一定在根节点的左子树中;如果给定的键key大于二叉查找树的根节点,那么只有当根节点右子树中存在小于等于key的节点时,小于等于key的最大键才会出现在右子树中,否则根节点就是小于等于key的最大键。/*在以Node为根节点的树中查找小于等于key的最大键(向下取整)*/Node floor原创 2016-12-08 13:00:46 · 551 阅读 · 0 评论 -
《算法》第二章——Nuts and bolts(螺丝和螺帽)
思路:标准的快排啊, 用螺母把螺丝分区,每次分区得到三个结果,A1,完全匹配的一对A2,比螺母小的螺丝A3,比螺母大的螺丝将1中的螺丝取出,用它对螺母分区,可以得到B1. 比螺丝小的螺母B2. 比螺丝大的螺母A2跟B1一一对应,A3跟B2一一对应,对(A2,B1)和(A3,B2)分别执行上述的算法,直至完全匹配。代码:/*假设螺钉和螺帽大小没有一原创 2016-11-25 22:18:58 · 6618 阅读 · 0 评论 -
《算法》第一章——二分查找(基础)
从文件中读取int型数据,通过二分查找判断从标准输入获得的int值是否存在于该文件中。#include #include #include using namespace std;int binary_search(int key,int a[],int len){ int low = 0; int high = len-1; while(low <= high)原创 2016-10-24 22:13:27 · 268 阅读 · 0 评论 -
求子数组的最大和
/**.求子数组的最大和题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。*/#includevoid SubArr原创 2014-06-03 12:31:11 · 588 阅读 · 0 评论 -
6.4.2走迷宫
#include #include #include #define MAXN 7int fa[MAXN][MAXN];//存储父节点int dist[MAXN][MAXN];//存储到(x,y)的最短距离int last_dir[MAXN][MAXN];//记录方向int vis[MAXN][MAXN];int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1}原创 2013-08-30 21:47:41 · 975 阅读 · 0 评论 -
高精度加法
//看到网上有一种方法是逆序存储在计算输出的,所以想了一种不要逆序的//感觉自己写的有很多地方可以优化。。。#include #include #include #define MAX 20void Plus(char *addend1,char *addend2,char *result){ int short_arr[MAX]={0},long_arr[MAX]={0原创 2013-09-07 15:27:31 · 601 阅读 · 0 评论 -
哈夫曼编码算法实现
/*哈夫曼编码实现HuffmanTree.c*/#include#include#includetypedef struct{ float weight; //存放节点的权值 unsigned int parent,LChild,RChild; //指向双亲,孩子节点的指针}HTNode,*HuffmanTree; //动态分配数组存储哈夫曼树typedef char *原创 2013-11-18 18:58:29 · 1941 阅读 · 1 评论 -
拓扑排序的应用
/*adjlist.h有向无环图的邻接表存储结构*/#include#include#include#define MAX_VERTEX_NUM 10#define MAX_NAME 10typedef char VertexData[MAX_NAME];typedef struct ArcNode{ int adjvex; int weight; struct ArcNo原创 2013-12-17 19:55:48 · 778 阅读 · 0 评论 -
渐进最优
归并排序和堆排序算法是渐进最优的,说到渐进这些算法是依赖于n的,并且忽略常数因子,这些算法随n的递增趋于最优。所以在基于比较的排序算法中,它们都是渐进最优的,它们只比较较少的次数,它们的运行时间主要受比较次数的影响,都是O(nlgn)。原创 2014-04-27 19:55:57 · 2154 阅读 · 0 评论 -
最短摘要生成
题目:Alibaba笔试题:给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键 字,请说明思路并编程实现方法String extractSummary(String description,String[] key words),目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。(不限原创 2014-05-21 17:51:27 · 919 阅读 · 0 评论 -
在二元树中找出和为某一值的所有路径
/**4.在二元树中找出和为某一值的所有路径题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如 输入整数22和如下二元树10/ /5 12/ /4 7则打印出两条路径:10, 12和10, 5, 7。二元树节点的数据结构定义为:struct BinaryTreeNode // a nod原创 2014-06-05 18:09:52 · 505 阅读 · 0 评论 -
查找最小的k个元素
/**查找最小的k个元素题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。*//*非常传统的一道题*/#include #include #define N 9#define K 4void HeapAdjust(int a[],int s,int k){ int t,key; k原创 2014-06-06 23:43:48 · 463 阅读 · 0 评论 -
翻转句子中单词的顺序
/**翻转句子中单词的顺序。题目:输入一个英文句子,翻转中单词的顺序 但内字符不变。句子中单词以空格符隔开。为简起见,标点号和普通字母一样处理例如输入"I am a student."则输出"student. a am I"*//*先把整个句子翻转过来,在意空格字符为界限翻转每个单词*/#include #include #include#define N 50void Tr原创 2014-06-15 09:07:28 · 484 阅读 · 0 评论 -
判断整数序列是不是二元查找树的后序遍历结果
/**判断整数序列是不是二元查找树的后序遍历结果题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:8/ /6 10/ / / /5 7 9 11因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回fal原创 2014-06-15 09:08:13 · 490 阅读 · 0 评论 -
求二叉树中节点的最大距离
/**求二叉树中节点的最大距离如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。*/#include#includetypedef struct BSTreeNode{ int data; struct BSTreeNode *left; // left chil原创 2014-06-15 19:49:56 · 604 阅读 · 0 评论 -
设计包含min函数的栈
/*2.设计包含min函数的栈。定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。*//*时间复杂度要求是O(1)所以遍历肯定不行。一开始想通过一个min指针始终指向最小的一个,可是突然发现在pop的时候如果把min指向的一项给pop掉了不就完了,可见只让一项保存这个最小值是行不通的。所以只能让所有在栈中的项都原创 2014-06-02 21:16:12 · 569 阅读 · 0 评论 -
把二元查找树转变成排序的双向链表
/*--------------------------------1.把二元查找树转变成排序的双向链表题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。10/ /6 14/ / / /4 8 12 16转换成双向链表4=6=8=10=12=14=16。首先我们定义的二元查找树 节点的数据结构如下:str原创 2014-06-02 21:05:56 · 566 阅读 · 0 评论 -
《算法》第二章——快排非递归实现
思路:其实就是用栈保存每一个待排序子串的首尾元素下标,下一次while循环时取出这个范围,对这段子序列进行partition操作。代码:#include#includeusing namespace std;int partition(int *a,int lo,int hi){//每次取第一个元素为pivot int pivot = a[lo]; w原创 2016-11-26 15:29:51 · 431 阅读 · 0 评论