数据结构与算法
wwhuai
Java、C++、算法、安卓
展开
-
8-3 深度优先
1、dfs算法模板 void dfs(char[][] grid,int x,int y){ //递归出口 if(x<0|| y<0 || x>=grid.length || y>=grid[0].length || grid[x][y]=='0'){ return; } ...原创 2020-01-19 01:34:07 · 250 阅读 · 0 评论 -
8-2 动态规划
1、最长公共子序列(LCS)class Solution { public int lcs(String A, String B) { if(A==null || B==null || A.length()==0 || B.length()==0){ return 0; } int m=A.length(),n=...原创 2020-01-19 01:28:47 · 175 阅读 · 0 评论 -
8-1 二分法
1、经典二分查找:跳出循环end在start右边class Solution{ public int binarySearch(int[] arr,int target){ if(arr==null || arr.length==0){ return -1; } int start = 0,en...原创 2020-01-19 01:23:26 · 240 阅读 · 0 评论 -
7-6 求二叉树中指定层次的节点个数
//求二叉树中指定层次的节点个数#include "btree.cpp"void Lnodenum(BTNode *b,int h,int k,int &n){ if (b==NULL) //空树直接返回 return; else //处理非空树 { if (h==k) n++; //当前访问的节点在第k层时,n增1 else if (h<k) //...原创 2018-03-08 21:56:02 · 2968 阅读 · 0 评论 -
3.12 用队列实现报数问题
算法阐述:元素全部入队、队列不空下循环{出队一个元素、打印一个元素、队列不空下循环{出队一个元素、入队一个元素}}程序代码://求解报数问题#include <stdio.h>#include <malloc.h>#define MaxSize 100typedef int ElemType;//----------------------------------...原创 2018-02-08 14:53:06 · 3222 阅读 · 1 评论 -
3.11 用栈实现对一个字符串按升序进行排序
算法阐述:voidStackSort(SqStack *&st){ 需要的对象有:一个临时栈tmpst,2个用于比较的栈顶元素e,ep,从st出栈的栈顶元素放到e,从tmpst出栈的栈顶元素放到ep。 SqStack *tmpst; ElemType e,ep; InitStack(tmpst); 使得st栈中元素不断的出栈后进栈...原创 2018-02-08 14:51:29 · 1455 阅读 · 0 评论 -
3.10 用栈实现解决迷宫问题(输出一条路径(非最短路径))
(1) 数据组织:设置一个数组mg,用0表示方块可走,用1表示方块不可走。(2) 定义迷宫栈的基本运算(3)bool mgpath()部分算法阐述如下,详细见具体代码完整代码://用栈求解迷宫问题#include <stdio.h>#include <malloc.h>#define MaxSize 100#define M 8#define N ...原创 2018-02-08 14:49:22 · 1233 阅读 · 0 评论 -
6-5 稀疏矩阵的三元组表示
#include <stdio.h>#define M 6#define N 7#define MaxSize 100 //矩阵中非零元素最多个数typedef int ElemType;typedef struct{ int r; //行号 int c; //列号 ElemType d; //元素值} TupNode; ...原创 2018-02-16 20:51:59 · 760 阅读 · 0 评论 -
6-4 稀疏矩阵的十字链表表示
//稀疏矩阵的十字链表表示#include <stdio.h>#include <malloc.h>#define M 3 //矩阵行#define N 4 //矩阵列#define Max ((M)>(N)?(M):(N)) //矩阵行列较大者typedef int ElemType;typedef ...原创 2018-02-16 20:50:29 · 757 阅读 · 0 评论 -
6-3 广义表基本运算算法
//广义表基本运算算法#include <stdio.h>#include <malloc.h>#include "glnode.h"int GLLength(GLNode *g) //求广义表g的长度{ int n=0; GLNode *g1; g1=g->val.sublist; //g指向广义表的第一个元素 while (g1!=NUL...原创 2018-02-16 20:48:37 · 854 阅读 · 0 评论 -
6-2 求广义表g的原子个数
#include "glist.cpp"//解法1的方法int Count1(GLNode *g) //求广义表g的原子个数{ int n=0; GLNode *g1=g->val.sublist; while (g1!=NULL) //对每个元素进行循环处理 { if (g1->tag==0) //为原子时 n++; //原子个数...原创 2018-02-16 20:45:31 · 1637 阅读 · 0 评论 -
6-1利用数组求解约瑟夫问题
//利用数组求解约瑟夫问题#include <stdio.h>#define MaxSize 100void josephus(int n,int m){ int p[MaxSize]; int i,j,t; for (i=0;i<n;i++) //构建初始序列 p[i]=i+1; t=0; //首次报数的起始位置 printf("出列顺序:...原创 2018-02-16 20:43:42 · 833 阅读 · 0 评论 -
3.8 判断表达式中的圆括号是否匹配
算法详述:(1) bool Math(char exp[ ],intn) :是否匹配,故返回值设计为bool类型,函数功能为输入一个表达式(字符串),故用char exp[ ],本来可在该函数内调用strlen函数计算字符串长度,但在此将strlen函数与Match函数划为同层级,故此函数不调用strlen函数,strlen函数由main函数调用,故用int n(2) 该算原创 2018-02-07 18:35:42 · 2164 阅读 · 0 评论 -
7-7 判断两棵二叉树是否相似
//判断两棵二叉树是否相似#include "btree.cpp"bool Like(BTNode *b1,BTNode *b2)//b1和b2两棵二叉树相似时返回true,否则返回false{ bool like1,like2; if (b1==NULL && b2==NULL) return true; else if (b1==NULL ...原创 2018-03-08 21:57:16 · 818 阅读 · 0 评论 -
7-8 输出二叉树中值为x的节点的所有祖先
//输出二叉树中值为x的节点的所有祖先#include "btree.cpp"bool ancestor(BTNode *b,ElemType x){ if (b==NULL) return false; else if (b->lchild!=NULL && b->lchild->data==x || b->rchild!=NULL &...原创 2018-03-08 21:58:25 · 6373 阅读 · 1 评论 -
7-19 并查集的算法
//并查集的算法#include <stdio.h>#define MaxSize 100#define N 10 //问题涉及的人数,人的编号从1到N#define M 7 //亲戚关系个数#define Q 3 //询问个数typedef struct node{ int data; //结点对应人的编号 int rank; //结点对应秩 int...原创 2018-03-11 15:28:11 · 346 阅读 · 0 评论 -
7-18 中序线索二叉树的算法
//中序线索二叉树的算法#include <stdio.h>#include <malloc.h>#define MaxSize 100typedef char ElemType;typedef struct node { ElemType data; int ltag,rtag; //增加的线索标记 struct node *lchild; ...原创 2018-03-11 15:26:44 · 517 阅读 · 0 评论 -
7-17 先序、中序和后序递归遍历算法
//先序、中序和后序递归遍历算法#include "btree.cpp"void PreOrder(BTNode *b) //先序遍历的递归算法{ if (b!=NULL) { printf("%c ",b->data); //访问根结点 PreOrder(b->lchild); //先序遍历左子树 PreOrder(b->rchild); //先...原创 2018-03-11 15:25:41 · 1408 阅读 · 0 评论 -
7-16 先序、中序和后序非递归遍历算法
//先序、中序和后序非递归遍历算法#include "btree.cpp"typedef struct { BTNode *data[MaxSize]; //存放栈中的数据元素 int top; //存放栈顶指针,即栈顶元素在data数组中的下标} SqStack; //顺序栈类型void InitStack(SqStack *&s) //初始化...原创 2018-03-11 15:24:43 · 579 阅读 · 0 评论 -
7-15 层次遍历算法
//层次遍历算法#include "btree.cpp"#define MaxSize 100//--------------------------------------------------------//--循环队列基本运算算法----------------------------------//----------------------------------------...原创 2018-03-11 12:52:55 · 455 阅读 · 0 评论 -
7-14 构造哈夫曼树和哈夫曼编码的算法
//构造哈夫曼树和哈夫曼编码的算法#include <stdio.h>#include <string.h>#define N 50 //叶子结点数#define M 2*N-1 //树中结点总数typedef struct{ char data[5]; //结点值 double weight; //权重 int parent; //双亲结点 i...原创 2018-03-11 12:51:50 · 1870 阅读 · 0 评论 -
7-13 构造二叉树的算法
//构造二叉树的算法#include "btree.cpp"BTNode *CreateBT1(char *pre,char *in,int n)/*pre存放先序序列,in存放中序序列,n为二叉树节点个数,本算法执行后返回构造的二叉链的根节点指针*/{ BTNode *b; char *p; int k; if (n<=0) return NULL; b=(BTNode...原创 2018-03-11 12:50:51 · 733 阅读 · 0 评论 -
7-12 二叉树的基本运算算法
//二叉树的基本运算算法#include <stdio.h>#include <malloc.h>#define MaxSize 100typedef char ElemType;typedef struct node { ElemType data; //数据元素 struct node *lchild; //指向左孩子节点 struct node...原创 2018-03-11 12:49:40 · 854 阅读 · 0 评论 -
7-11 将二叉树的顺序存储结构转换成二叉链存储结构
//将二叉树的顺序存储结构转换成二叉链存储结构#include "btree.cpp"#define MaxSize 30typedef char Elemtype;typedef ElemType SqBTree[MaxSize];BTNode *trans(SqBTree a,int i){ BTNode *b; if (i>MaxSize) return(NULL)...原创 2018-03-11 12:48:42 · 6612 阅读 · 2 评论 -
7-10 采用层次遍历方法输出从根节点到每个叶子节点的路径逆序列
//采用层次遍历方法输出从根节点到每个叶子节点的路径逆序列#include "btree.cpp"#define MaxSize 100//----------------------------------------------------------//-非环形队列的基本运算算法---------------------------------//----------------...原创 2018-03-08 22:00:25 · 1474 阅读 · 0 评论 -
7-9 采用后序遍历非递归算法输出从根节点到每个叶子节点的路径逆序列
//采用后序遍历非递归算法输出从根节点到每个叶子节点的路径逆序列#include "btree.cpp"typedef struct { BTNode *data[MaxSize]; //存放栈中的数据元素 int top; //存放栈顶指针,即栈顶元素在data数组中的下标} SqStack; //顺序栈类型void InitStack(SqStack ...原创 2018-03-08 21:59:31 · 2315 阅读 · 0 评论 -
3.9 用栈实现中缀表达式转化成后缀表达式、后缀表达式求值
算法阐述:voidtrans(char exp[ ],char postexp[ ]){ 形参设计:传进2个字符数组的地址,第一个为中缀表达式的数组地址,将此 中缀表达式转化为后缀表达式赋给第二个地址所在的字符数组。 while(*exp!=’\0’){switch(*exp){(1)扫描为‘(’:进栈,exp++,break;(2)扫原创 2018-02-07 18:39:04 · 1167 阅读 · 0 评论 -
7-5 求二叉树中指定节点的层次
//求二叉树中指定节点的层次#include "btree.cpp"int Level(BTNode *b,ElemType x,int h) //h置初值1{ int l; if (b==NULL) return(0); else if (b->data==x) return(h); else { l=Level(b->lchild,x,h+1); //在左子树...原创 2018-03-06 23:31:40 · 10440 阅读 · 1 评论 -
5-3 求一个顺序表中最大元素的递归算法
//求一个顺序表中最大元素的递归算法 #include <stdio.h>#define MaxSize 50typedef int ElemType; typedef struct { ElemType data[MaxSize]; //存放顺序表元素 int length; //存放顺序表的长度} SqList; //顺序表的类型Ele...原创 2018-02-13 13:08:54 · 3699 阅读 · 0 评论 -
5-2 求实数数组A[0..n-1]中的最小值的递归算法
//求实数数组A[0..n-1]中的最小值#include <stdio.h>double Min(double A[],int i){ double min; if (i==0) return A[0]; else { min=Min(A,i-1); if (min>A[i]) return(A[i]); else return(min); }}int...原创 2018-02-13 13:07:42 · 2427 阅读 · 1 评论 -
5-1 求n!的递归算法
//求n!的递归算法#include <stdio.h>int fun(int n){ if (n==1) return(1); else return(fun(n-1)*n); }int main(){ printf("10!=%d\n",fun(10)); return 1;}原创 2018-02-13 13:06:10 · 3094 阅读 · 0 评论 -
5-0 关于递归本质的理解
1、理解递归,关键是脑中有一幅代码的图片,函数执行到递归函数入口时,就扩充一段完全一样的代码,执行完扩充的代码并return后,继续执行前一次递归函数中递归函数入口后面的代码),阅读递归函数最容易的方法不是纠缠于它的执行过程,而是相信递归函数会顺利完成它的任务。如果你的每个步骤正确无误,你的限制条件设置正确,并且每次调用之后更接近限制条件,递归函数总是能正确的完成任务。2、递归算法的设计:(1)递...原创 2018-02-13 13:04:39 · 300 阅读 · 0 评论 -
4-6 BF算法
串的模式匹配--Brute-Force算法(BF算法)//BF算法#include "sqstring.cpp"int index(SqString s,SqString t){ int i=0,j=0; while (i<s.length && j<t.length) { if (s.data[i]==t.data[j]) //继续匹配下一个字符...原创 2018-02-09 13:13:48 · 369 阅读 · 0 评论 -
4-7 kmp算法
串的模式匹配2--Knuth-Morris-Pratt算法(kmp算法)算法描述:(1) 关于next数组的实现算法:void GetNext(String s,int next[ ]){ int j,k; j=0;k=-1; next[0]=-1; while(每个字符的前的串中进行遍历) { ...原创 2018-02-12 09:54:43 · 305 阅读 · 0 评论 -
2-1求集合(用单链表表示)的并、交和差运算
#include<stdio.h>#include<malloc.h>typedef char ElemTypetypedef struct LNode{ ElemType data; struct LNode *next; } LinkNode;void CreateListF(LinkNode *&L,ElemType a[],int a) ...原创 2018-02-07 16:30:12 · 3647 阅读 · 0 评论 -
4-5把串s中最先出现的子串"ab"改为"xyz"
//把串s中最先出现的子串"ab"改为"xyz"#include "listring.cpp"void Repl(LinkStrNode *&s){ LinkStrNode *p=s->next,*q; int find=0; while (p->next!=NULL && find==0) //查找'ab'子串 { if (p->dat..原创 2018-02-09 13:09:06 · 1590 阅读 · 1 评论 -
4-4求串s中第一个最长的连续相同字符构成的平台
//求串s中第一个最长的连续相同字符构成的平台#include "sqstring.cpp"void LongestString(SqString s,int &index,int &maxlen){ int length,i=1,start; //length保存平台的长度 index=0,maxlen=1; //index保存最长平台在s中的开始位置,maxle...原创 2018-02-09 13:08:06 · 1029 阅读 · 1 评论 -
4-3按字典顺序比较两个串s和t的大小
//按字典顺序比较两个串s和t的大小#include "sqstring.cpp"int Strcmp(SqString s,SqString t){ int i,comlen; if (s.length<t.length) comlen=s.length; //求s和t的共同长度 else comlen=t.length; for (i=0;i<comlen;i++) ...原创 2018-02-09 13:07:01 · 3341 阅读 · 1 评论 -
4-2链串基本运算的算法
//链串基本运算的算法#include <stdio.h>#include <malloc.h>typedef struct snode { char data; struct snode *next;} LinkStrNode;void StrAssign(LinkStrNode *&s,char cstr[]) //字符串常量cstr赋给串s...原创 2018-02-09 13:05:41 · 1613 阅读 · 0 评论 -
5-4 释放一个不带头结点的单链表L中所有结点的递归算法
//释放一个不带头结点的单链表L中所有结点的递归算法 #include "linklist.cpp"void release(LinkNode *&L){ if (L!=NULL) { release(L->next); free(L); }}int main(){ LinkNode *h; int a[]={1,2,3,4}; InitList(h)...原创 2018-02-13 13:10:44 · 2601 阅读 · 0 评论