数据结构
名字没想好,就叫这个吧
这个作者很懒,什么都没留下…
展开
-
全部输入是小括号的字符串,判断是否匹配
#include<stdio.h>#include<stdlib.h>#define MAX 50bool pipei(char * a){ int i = 0; int result = 0; while (a[i] != '\r'&&a[i]!='\n') { if (a[i] == '(') { res原创 2017-07-20 14:23:58 · 1357 阅读 · 1 评论 -
字符流中第一个不重复的字符
时间限制:1秒 空间限制:32768K 热度指数:34735 本题知识点: 字符串题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。 输出描述: 如果当前字符流没有存在出现一次的字符,返回#字符。题解:应用哈希表的思想,将原创 2017-08-12 02:02:00 · 273 阅读 · 0 评论 -
直接插入排序
//直接插入排序void InsertSort(int *a,int length){//0,11,1,2,3,7,8,9,4,5,6,10 //0号元素不使用 for (int i = 2; i < length; i++) { a[0] = a[i]; int j = i - 1; while(j>0&&a[0]<a[j原创 2017-07-28 14:59:47 · 149 阅读 · 0 评论 -
折半插入排序
折半插入的本质上,依旧是插入排序,只是在寻找插入点的时候将使用折半查找,用以减少查找数据的次数。数组的第0个元素不在排序序列中,用来保存将要插入的数据。//折半直接插入排序void BinsrySort(int *a, int length){ //第0号元素不使用 for (int i = 1; i < length; i++) { a[0] = a[i原创 2017-07-28 15:17:42 · 227 阅读 · 0 评论 -
快速排序
//快速排序之获得点int QSort(int *a, int i, int j){ a[0] = a[i];//将与之比较的点 while (i<j) { while (i<j&&a[0]<a[j])//找到比他小的第一个点 { j--; } if (a[0] > a[j])//如果原创 2017-07-28 16:05:51 · 176 阅读 · 0 评论 -
shell排序
#include<stdio.h>#include<stdlib.h>//输出void print(int *a,int length){ for (int i = 1; i < length; i++) printf("%d ",a[i]); printf("\n");}//shell排序的过程//数组第一个数据,不使用。void pro(int *a,原创 2017-08-07 09:10:53 · 295 阅读 · 0 评论 -
归并排序
#include<stdio.h>#include<stdlib.h>#define N 18void Merge(int *a,int low,int mid,int high,int *b){//将一个数组按照从小到大的顺序排序 int i = low; int j = mid + 1; int k = low; while (i <= mid &&j <=原创 2017-08-07 10:06:44 · 163 阅读 · 0 评论 -
1052. 卖个萌 (20)
萌萌哒表情符号通常由“手”、“眼”、“口”三个主要部分组成。简单起见,我们假设一个表情符号是按下列格式输出的:左手[右手] 现给出可选用的符号集合,请你按用户的要求输出表情。输入格式:输入首先在前三行顺序对应给出手、眼、口的可选符号集。每个符号括在一对方括号[]内。题目保证每个集合都至少有一个符号,并不超过10个符号;每个符号包含1到4个非空字符。之后一行给出一个正整数K,为用户请求的个数。随后K原创 2017-09-06 09:30:50 · 293 阅读 · 0 评论 -
大富翁游戏
时间限制:1秒 空间限制:32768K 大富翁游戏,玩家根据骰子的点数决定走的步数,即骰子点数为1时可以走一步,点数为2时可以走两步,点数为n时可以走n步。求玩家走到第n步(n<=骰子最大点数且是方法的唯一入参)时,总共有多少种投骰子的方法。 输入描述: 输入包括一个整数n,(1 ≤ n ≤ 6)输出描述: 输出一个整数,表示投骰子的方法输入例子1: 6输出例子1: 32/*手写,算原创 2017-08-30 11:27:16 · 3928 阅读 · 0 评论 -
最长公共子序列(动态规划)
串1:ABCBDAB len1=7 串2:BDCABA len2=6计算这两个串的最长公共子序列。解这个题,最重要的是,对表格的理解。 建立一张7*8的表格,多出来的一行一列,用做当该串是空串的时候,应该怎么做。 很明显需要初始化为0(空串和任何串都不能有公共子序列)。int main(void){ string str1 = "ABCBDAB"; str原创 2017-08-30 16:36:09 · 278 阅读 · 0 评论 -
最长连续公共子串
时间限制:1秒 空间限制:32768K 给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度。 输入描述: 输入为两行字符串(可能包含空格),长度均小于等于50.输出描述: 输出为一个整数,表示最长公共连续子串的长度。输入例子1: abcde abgde输出例子1: 2#include<stdio.h>#include<vector>#include<stri原创 2017-08-30 17:46:25 · 929 阅读 · 0 评论 -
0-1背包
最主要是要看懂下面这张表:int main(void){ int goods_num = 3;//总共三件物品 int worth_num = 5;//背包容量最大为5 int goods[] = { 0,60,100,120 };//物品的价值 int weight[] = { 0,1,2,3 };//物品的重量 /*即 物品1 重1斤,价值60人民币*/原创 2017-08-30 20:03:33 · 388 阅读 · 0 评论 -
辗转相除法求最大公约数
//递归版本int gcd(int a, int b) { return b == 0 ? a : gcd(b, a%b);}//非递归版本int gcd(int a, int b) { int c; while (b != 0) { c = a % b; a = b; b = c; } return a;}转载 2017-08-29 19:24:58 · 295 阅读 · 0 评论 -
1043. 输出PATest(20)
给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按“PATestPATest….”这样的顺序输出,并忽略其它字符。当然,六种字符的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按PATest的顺序打印,直到所有字符都被输出。输入格式:输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。输出格式:在一行中按题目要求输出排序后的字符串。题原创 2017-09-02 10:02:48 · 182 阅读 · 0 评论 -
1049. 数列的片段和(20)
给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段。例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4) (0.2) (0.2, 0.3) (0.2, 0.3, 0.4) (0.3) (0.3, 0.4) (0.4) 这10个片段。给定正整数数列,求出全部片段包含的所有的数原创 2017-09-02 10:18:50 · 169 阅读 · 0 评论 -
KMP详解
首先,next数组是怎么得来的???i 为指向字符串T的下标的变量, j 是指向以 i-1 位置为结束的字符的字符串的 相同的前后缀最长的 前缀的结束字符的下标。next数组实质上是,在 i 的位置之前的字符串的前缀(不包含本身)和后缀(不包含本身)的相同的字符的个数。一、给next[0]赋值为-1,因为第一个字符之前没有任何的字符串,用-1来标志已经将 i 位置之前整个字符串比较完毕。二、原创 2017-08-04 16:28:00 · 198 阅读 · 0 评论 -
折半查找
查找 5 成功查找失败high比low小,则查找失败//折半查找typedef struct{ int num;}student;typedef struct{ int length; student st[MAX + 1];}student_t;int Binary_Search(student_t st_t, student st){ int lo原创 2017-07-26 18:00:45 · 175 阅读 · 0 评论 -
卡特兰数证明
1.饭后,姐姐洗碗,妹妹把姐姐洗过的碗一个一个地放进碗橱摞成一摞。一共有n个不同的碗,洗前也是摞成一摞的,也许因为小妹贪玩而使碗拿进碗橱不及时,姐姐则把洗过的碗摞在旁边,问:小妹摞起的碗有多少种可能的方式? 2.给定n个数,有多少种出栈序列? 3.一个有n个1和n个-1组成的字串,且前k个数的和均不小于0,那这种字串的总数为多少?这三个问题具有相同的结构,三个问题是可以互相转化。将姐姐放碗看做入转载 2017-07-20 08:03:47 · 387 阅读 · 0 评论 -
括号{}()[]匹配
使用栈来实现#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX 100typedef struct elem{ int date;};typedef struct LinkStack{ elem elem_date; LinkStack *next;}LinkStack;//初始化vo原创 2017-07-20 15:02:33 · 286 阅读 · 0 评论 -
哈夫曼树
(一)基础知识 路径:从一个结点到另一个结点之间的分支序列。 路径长度:从一个结点到另一个结点所经过的分支数目。 结点的权:根据应用的需要可以给树的结点赋权值 带权路径长度:从根到该结点的路径长度与该结点权的乘积。 树的带权路径长度: 树中所有叶子结点的带权路径之和。 哈夫曼树:由n个带权叶子结点构成的所有二叉树中带权路径长度最短的二叉树。又叫最优二叉树。(二)有数据为{ 22,10,4原创 2017-07-22 21:48:42 · 454 阅读 · 0 评论 -
判断两棵二叉树是不是相同
(一)在左右节点不可以旋转的时候://核心代码,先确定根节点是否相同,再判断左孩子和右孩子是否相同。bool equal(tree *root ,tree *root1){ if (root == NULL&&root1 == NULL) { return 1; } if (!root || !root1 ) { retur原创 2017-07-23 19:24:58 · 515 阅读 · 0 评论 -
两个栈实现队列的功能。(外部接口是队列)
#include<stdio.h>#include<stdlib.h>//栈typedef struct Stack{ int date; Stack *next;}Stack;//队列typedef struct Queue{ Stack *front; Stack *tail;}Que;//栈的初始化void Init_stack(Stack **原创 2017-07-19 17:40:26 · 190 阅读 · 0 评论 -
链式队列的基本操作(配图)
一、结构体结构队列中储存的内容,本身是一个链表 队头和队尾只是指向这个链表的两个指针,这样就可以使用两个指针控制访问的事件typedef struct elem{ int date; elem *next;}elem;typedef struct queue{ elem *tail; elem *head;}queue;二、初始化下图是初始化完结构体的样子v原创 2017-07-18 23:23:41 · 9696 阅读 · 0 评论 -
图书馆里有没有某本书,现有6人排队,有3个人来借此书,3个人来还此书,且若到某人借书时,若无书,则立即离开,多少种排队方法能借到书?
#include<stdio.h>#include<stdlib.h>#define SUM 6int state[SUM];//1代表还书 -1代表借书//void book(int book_lend,int book_return,int num,int count){ //算法结束的条件是:借书的人都借到了,即book_lend==0 if (book_lend原创 2017-07-19 17:41:27 · 911 阅读 · 0 评论 -
设一个没有头结点指针的单链表。一个指针指向此单链表中间的一个结点(不是第一个,也不是最后一个结点),将该结点从单链表中删除,要求时间复杂度O(1)。
void delete_two(node *other){ if (other != NULL) { node *q = (node *)malloc(sizeof(node)); q = other->next; other->next = q->next; other->date = q->date;原创 2017-07-17 22:49:53 · 608 阅读 · 0 评论 -
单链表的简单操作
typedef struct Node{ int date; struct Node *next;}node;//链表的初始化void Init(node **head){ if (*head != NULL) { node * p = (node*)malloc(sizeof(node)); p->next = NULL;原创 2017-07-17 21:56:06 · 209 阅读 · 0 评论 -
利用链表的头插法,将链表逆序
while(旧链表不为空) { 第一步: 将旧链表从第二个有效数据保存下来到NEXT链表中。 第二步: 将旧链表中的NEXT置为空。 第三步: 将第二步中的链表赋值给新链表的NEXT。 第四步: 将第一步保存的链表赋值给旧链表中,用以循环。 }原创 2017-07-17 21:28:32 · 2344 阅读 · 0 评论 -
二叉树按层遍历输出——双指针法(图解)
(一)申请一个vector的容器vt。 (二)设置两个指针(当然,不是必须是指针形式的指针,可以用数组的下标代替,只是采用指针这个思想),这两个指针一个指向当前访问的节点——cur(标志目前访问的是哪个节点),另外一个指向当前层访问节点的最后一个节点——end(标志当前层访问结束)。 (三)对两个指针的初始化:首先在根节点不为NULL的情况下,将根节点装入容器,然后cur从0开始,end等于容器原创 2017-07-24 09:59:41 · 1322 阅读 · 0 评论 -
输出二叉树中叶子结点的个数
int leaf(tree * root){ if (root == NULL)//如果根节点为空,则返回空 return 0; else if (root->lchild == NULL&&root->rchild == NULL)//如果左孩子和右孩子同时为空,则叶子节点的数加+1 return 1; else retur原创 2017-07-24 10:19:16 · 7702 阅读 · 3 评论 -
二叉排序树创建、查找、删除
一、二叉树的结构体结构typedef struct tree{ int date; tree *lchild; tree *rchild;}tr_t;二、二叉排序树的创建void creat_BStree(tr_t ** tr,int num){ if ((*tr) == NULL) { (*tr) = (tree*)malloc(s原创 2017-07-26 17:46:09 · 414 阅读 · 0 评论 -
线性查找
//线性查找//将第0个元素,做为防止越界的标记//从后往前查typedef struct { int num;}student;typedef struct{ int length; student st[MAX+1];}student_t;int search1(student_t st,int flag){ int i = st.length;原创 2017-07-26 17:47:30 · 280 阅读 · 0 评论 -
1013. 数素数 (20)
令Pi表示第i个素数。现任给两个正整数M <= N <= 104,请输出PM到PN的所有素数。输入格式:输入在一行中给出M和N,其间以空格分隔。输出格式:输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。输入样例: 5 27 输出样例: 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89原创 2017-09-02 17:09:32 · 303 阅读 · 0 评论