数据结构
零丁若叹
这个作者很懒,什么都没留下…
展开
-
数组中出现次数超过一半的数字
实现一个函数,找出数组中出现次数超过一半的元素思路:默认第一个元素为找到的元素result,设置times变量为1,遍历数组,如果后面的元素等于result,times加1,如果后面的元素不等于result,times减1,如果times为0,则把result替换为当前元素C++.h#ifndef MoreThanHalf_hpp#define MoreThanHalf_hpp#include <stdio.h>#endif /* MoreThanHalf_hpp */in原创 2022-03-11 23:50:34 · 796 阅读 · 0 评论 -
字符串的排列组合
一个字符串,打印出所有的排列组合,如"abc",所有的排列组合为abc,acb,bac,bca,cba,cab思路: 先确定第一位字符,问题转化为求解后面n-1个字符的排列组合问题,可以使用递归的方式解决。第一位字符可以是字符串中的任何一个字符,所以需要把每一个字符交换到首位,先使用循环,循环里面调用递归函数。C++.h#ifndef Arrangement_h#define Arrangement_h#include <stdio.h>#endif /* Arrangemen原创 2022-03-06 22:55:59 · 495 阅读 · 0 评论 -
层序遍历二叉树
实现一个函数,完成层序遍历二叉树。思路:使用一个队列,保存根结点,先打印根结点的值,把根结点从队列中清除。把根结点的左结点放入到队列中,把根结点的右结点放入队列中,循环进行此过程。C++.h#ifndef TreeAbout_hpp#define TreeAbout_hpp#include <stdio.h>#endif /* TreeAbout_hpp */struct TreeNode{ int val; TreeNode *left; Tre原创 2022-03-05 19:41:54 · 566 阅读 · 0 评论 -
链表的反转
实现一个函数,完成链表的反转思路:1.循环的方式建立两个指针,前面的指针的next指向后面的指针,然后分别移动两个指针,循环到链表结尾2.递归的方式处理head结点的反转使用head->next->next = head,head->next = NULL,然后递归反转剩余的链表部分.hpp文件#ifndef LinkedList_hpp#define LinkedList_hpp#include <stdio.h>#endif /* LinkedList原创 2022-03-05 11:27:24 · 469 阅读 · 0 评论 -
链表倒数第k个结点
实现一个函数,查找链表的倒数第k个结点思路:使用两个指针,第一个指针先指向第k个结点,然后两个指针同时移动,第一个指针移动到末尾的时候,第二个指针刚好位于倒数第k个位置C++.hpp文件//// LinkedList.hpp// CPlusPlusProject////////微信公众号:程序员开发环境#ifndef LinkedList_hpp#define LinkedList_hpp#include <stdio.h>#endif /* Linked原创 2022-03-02 22:37:20 · 241 阅读 · 0 评论 -
数据结构与算法代码选集
1.整形二维数组中,每一行从左到右递增,每一列从上到下递增,判断数组中是否含有该整数。https://blog.csdn.net/u011608357/article/details/122899737?spm=1001.2014.3001.55022.一个字符串空间足够,把字符串中的每个空格替换成"%20",如"He ll o"替换为"He%20ll%20o"https://blog.csdn.net/u011608357/article/details/122911005?spm=1001.201原创 2022-02-27 23:54:35 · 263 阅读 · 0 评论 -
移动数组正负数
一个整型数组,包含负数和正数,实现一个函数,把所有的负数挪到数组的左边,所有的正数挪到数组的右边。思路:使用两个指针,分别从数组的两头遍历数组,从左边找到一个负数,从右边找到一个正数,交换这两个数字,循环此过程,知道两个指针相遇。C++.h文件#ifndef PositiveNegative_h#define PositiveNegative_h#include <stdio.h>#endif /* PositiveNegative_h *//* arr为数组,low为数原创 2022-02-27 13:37:38 · 530 阅读 · 0 评论 -
斐波那契数
实现一个函数,输入n,输出第n个斐波那契数思路:可以使用递归和循环的方式分别实现。如果使用的递归,斐波那契数f(n)=f(n-1) + f(n-2)。如果使用循环实现,只要新建变量保存前面两个结果f(n-1)和f(n-2)就可以了。C++.h文件#ifndef FibNumber_h#define FibNumber_h#include <stdio.h>#endif /* FibNumber_h *///n为第几个斐波那契数int fibNumberRecursive(原创 2022-02-26 23:31:40 · 373 阅读 · 0 评论 -
二分查找实现
一个整型有序数组,完成二分查找思路:待查找数字和中间的数字比较,如果比中间的数字小,则在前半段继续查找,如果比中间的数字大,则在后半段继续查找C++.h文件#ifndef BinarySearch_h#define BinarySearch_h#include <stdio.h>#endif /* BinarySearch_hpp *//* arr为待查找数据 low为数组最小的序号 high为数组最大的序号 target为待查找数字 返回值0代表找到,返回值-1原创 2022-02-26 22:13:17 · 296 阅读 · 0 评论 -
快速排序实现
一个整型数组,完成快速排序思路:选取一个元素作为哨兵元素,遍历数组,比哨兵元素小的元素放在左侧,比哨兵元素大的放在右侧,再把哨兵元素放在中间位置,递归此过程。C++代码QuickSort.h文件#ifndef QuickSort_h#define QuickSort_h#include <stdio.h>#include <iostream>#endif /* QuickSort_hpp *//* arr为待排序数组 low为数组最小的序号, high为原创 2022-02-25 23:59:39 · 118 阅读 · 0 评论 -
两个栈实现一个队列
使用两个栈实现一个队列,实现添加方法appendData,实现删除对头元素方法deleteData,实现查看对头元素headData方法思路:栈是现金后出的数据结构,队列是先进先出的数据结构。可以使用第一个栈存入数据实现appendData。需要删除或者查看队头元素时,如果第二个栈为空,把第一个栈的数据存放到第二个栈里面,返回第二个栈的栈顶元素就可以了。如果第二个栈不为空,直接返回第二个栈的栈顶元素。stack.hpp头文件#ifndef StackQueue_hpp#define StackQu原创 2022-02-20 17:26:10 · 410 阅读 · 0 评论 -
链表基本操作
链表是一种基本的数据结构,它由链表结点串联而成,在内存中的存放地址是不连续的。链表结点包含了一个值和指向下一个结点的指针,本篇文章介绍链表的基本操作,包括链表的建立,遍历,查询和删除。#include <iostream>/* arr为数组,length为数组长度 */LinkNode *createLink(int arr[], int length){ if (arr == NULL) { return NULL; } int原创 2022-02-19 23:42:01 · 299 阅读 · 0 评论 -
字符串替换空格
题目:一个字符串空间足够,把字符串中的每个空格替换成"%20",如"He ll o"替换为"He%20ll%20o"思路:先遍历字符串,获得空格的个数,从而获取新字符串的长度。从字符串的尾部遍历字符串,逐个复制字符,遇到空格替换为%20.#include <iostream>void trimBlank(char arr[], int length){ if (arr == NULL || length <= 0) { return; }原创 2022-02-13 16:58:38 · 610 阅读 · 0 评论 -
二维数组查找元素
整形二维数组中,每一行从左到右递增,每一列从上到下递增。判断数组中是否含有该整数。**思路: 从右上角开始查找,带查找的数字如果小于右上角的数,说明要查找的数字不在当前列,列数查找范围缩小,如果大于右上角的数,行数查找范围缩小。C++**#include <iostream>bool findNumber(int arr[][3], int rows, int columns, int num){ if (arr == NULL || rows <= 0 || col原创 2022-02-12 17:46:05 · 781 阅读 · 0 评论 -
队列的数组和链表实现
1.队列是先入先出额数据结构,它的实现可以用数组,也可以用链表。用数组实现链表时,需要预先分配数组的大小,用front和rear下标分别表示队头元素下标和队尾元素下标,插入一个元素时,使队尾的下标rear加1,删除一个元素时,front下标加1,判断是否为空的队列只要判断front和rear是否相等。队列的插入操作可表示为# include # include # define M原创 2014-02-09 10:58:46 · 3501 阅读 · 0 评论 -
栈的实现及应用
1.栈是先入后出的数据结构,它的实现可以用数组或者栈顶指针表示,用数组时,可以为栈预分配一定的大小,栈为空时,下标值为top为-1,每增加一个元素,下标值加1,出栈时,弹出一个元素,下标值减1,判断栈是否为空可以用下标值top是否为-1。# include # include int stack[100]={};int top=-1;int size=100;int mai原创 2014-02-08 22:03:18 · 1129 阅读 · 0 评论 -
判断两个链表是否相交
判断两个链表是否相交,《编程之美》给出了以下方法:1.判断第一个链表的每个节点是否在第二个链表中,这种方法的时间复杂度为:O(length(h1)*length(h2)),这种方法很耗时间2.利用计数的方法 一个简单的做法是对第一个链表的结点地址进行hash排序,建立hash表,然后针对第二个链表的每个节点的地址查询hash表,如果它在哈希表中出现,那么说明第二个链表和第一个链表有共同的结原创 2014-04-06 17:18:38 · 1294 阅读 · 0 评论 -
双向链表实现队列
双向链表的结点包含前驱指针和后继指针,队列入队操作是在双向链表尾部添加元素,队列的出队操作是把双向链表的头结点删除,判断队列是否为空只要判断双向链表的头指针是否指向了NULL即可。# include # include using namespace std;struct queueNode{ int val; queueNode *pre; queueNode *next;原创 2014-08-02 10:59:18 · 3128 阅读 · 0 评论 -
树的递归创建和递归遍历
# include # include struct treenode{ char ch; treenode *left,*right; /*左指针和右指针*/};typedef treenode *treelink;int main(){ treelink createtree(treelink); void preorder(treelink原创 2014-02-15 21:36:47 · 1889 阅读 · 0 评论 -
双向链表的建立
双向链表的建立插入删除的方式与单链表类似,要注意的是双向链表的头部和尾部各有一个NULL指针,指示链表的结束。每个链表节点有两个指针分别是前驱指针和后继指针,指向前后两个节点。下面是双向链表的代码:# include # include struct list{int num;list *next,*prior;};typedef list *link;int ma原创 2014-02-09 19:32:56 · 1111 阅读 · 0 评论 -
图的存储方式
1.图的存储方式图的存储方式有邻接矩阵,邻接链表,十字链表等,邻接矩阵表示法通常将图G中的结点编为1,2,3…V,然后构造一个V*V的矩阵a[V][V],邻接矩阵的空间需求是O(V^2).对于无向图,邻接矩阵是一个对称矩阵,有时为了减少空间需求,可以存储半个矩阵。邻接矩阵也可以存储权重图,矩阵中的元素代表权重值,如果两个结点之间没有边,可以将对应的权重值设置为-1或者一个不可能的值。对原创 2014-03-09 23:15:41 · 1155 阅读 · 0 评论 -
优先队列
队列可以分为FIFO队列和优先队列,优先队列也可以分为最大优先队列和最小优先队列。优先队列可以使用堆来实现,在一个堆结构中,优先队列的查找,插入,删除操作,都可以在O(lgn)的时间内完成。优先队列的常见使用是操作系统的作业调度,每当发生中断时,操作系统会从优先队列中选取一个优先级别最高的作业执行。下面是用最小堆实现的最小优先队列:# include using namespace st原创 2014-03-30 17:09:29 · 994 阅读 · 0 评论 -
跳跃表
跳跃表是一种随机化的数据结构,它的效率与平衡二叉查找树差不多,插入,查找,删除操作的期望时间是O(logn)。跳跃表按层构造,查找元素是沿着最高一层的元素开始,逐步向下向后移动,插入、删除操作必须在多层元素之间即多个链表中插入删除。跳跃表使用用了随机化的算法,并不能保证所有操作的最坏情况复杂度为O(logn),但在实际中,它工作得很好。跳跃的C语言实现:# include using n原创 2014-03-30 22:58:33 · 880 阅读 · 0 评论 -
不相交集ADT
1.不相交集是解决等价关系的一种数据结构,执行合并和查找的速度都非常快,M次运行合并和查找的运行时间为(M*logN)。2.不相交集ADT支持三种操作:Union操作:把两个集合合并Find操作:查找某个元素所在集合的名字,两个元素x,y在同一个集合中的充要条件是Find(x)和Find(y)返回的结果相同。Set操作:生成若干个集合不相交集的初始操作代码为:void in原创 2014-03-23 09:29:08 · 1696 阅读 · 0 评论 -
多项式的表示
1.多项式的系数存放在数组中# include # include # define max(x,y) ((x)>(y)?(x):(y))using namespace std;const int N=100;struct poly{int arr[N];int mexp;};void add(poly &a,poly &b,poly &c){ memset(c.ar原创 2014-06-07 08:45:55 · 1346 阅读 · 0 评论 -
二叉查找树python实现
1. 二叉查找树的定义:左子树不为空的时候,左子树的结点值小于根节点,右子树不为空时,右子树的结点值大于根节点,左右子树分别为二叉查找树2. 二叉查找树的最左边的结点即为最小值,要查找最小值,只需遍历左子树的结点直到为空为止,同理,最右边的结点结尾最大值,要查找最大值,只需遍历右子树的结点直到为空为止。二叉查找树的插入查找和删除都是通过递归的方式来实现的,删除一个结点的时候,先找到这个结点原创 2014-06-29 14:05:01 · 4332 阅读 · 1 评论 -
二叉查找树C语言实现
二叉查找树C语言实现1. 二叉查找树的定义:左子树不为空的时候,左子树的结点值小于根节点,右子树不为空时,右子树的结点值大于根节点,左右子树分别为二叉查找树2. 二叉查找树的最左边的结点即为最小值,要查找最小值,只需遍历左子树的结点直到为空为止,同理,最右边的结点结尾最大值,要查找最大值,只需遍历右子树的结点直到为空为止。二叉查找树的插入查找和删除都是通过递归的方式原创 2014-06-30 12:39:39 · 1347 阅读 · 0 评论 -
不相交集python实现
1.不相交集是解决等价关系的一种数据结构,执行合并和查找的速度都非常快,M次运行合并和查找的运行时间为(M*logN)。在一个集合中,对于每一对元素(a,b),a,b∈S,对于关系R如果满足下面三个条件,则成关系R为等价关系:(1)自反性 对于所有a∈S,aRa(2)对称性 aRb当且仅当bRa(3)传递性 若aRb且bRc,则aRc有关不相交集的介绍原创 2014-07-20 09:43:39 · 1448 阅读 · 0 评论 -
trie树(字典树)
1. trie树,又名字典树,顾名思义,它是可以用来作字符串查找的数据结构,它的查找效率比散列表还要高。trie树的建树:比如有字符串”ab” ,“adb”,“adc” 可以建立字典树如图: 树的根节点head不存储信息,它有26个next指针,分别对应着字符a,b,c等。插入字符串ab时,next[‘a’-‘a’]即next[0]为空,这原创 2014-06-14 08:56:41 · 1007 阅读 · 0 评论 -
单链表反转python实现
单链表的反转可以使用循环,也可以使用递归的方式1.循环反转单链表循环的方法中,使用pre指向前一个结点,cur指向当前结点,每次把cur->next指向pre即可。 代码:class ListNode: def __init__(self,x): self.val=x; self.next=None;def nonrecurse(he...原创 2014-07-05 09:51:21 · 30252 阅读 · 2 评论 -
最小生成树
最小生成树即在加权连通图里寻找n-1条边,连接n个顶点,并且使得所有边的权重之和最小。最小生成树常用的算法有prim算法和kruskal算法。1. prim算法prim算法的基本步骤是:假设图的顶点集合为V,边集合为E,初始化集合U={u},此时集合中只有一个结点u,从u的邻接顶点中选取一个顶点v,使得这两个顶点之间的权重最小,然后把v加入结合U中,再从结点v出发,选取最小权重对应的结点加原创 2014-06-15 08:29:42 · 1161 阅读 · 0 评论 -
B树及其实现
B树的定义假设B树的度为t(t>=2),则B树满足如下要求:(参考算法导论)(1) 每个非根节点至少包含t-1个关键字,t个指向子节点的指针;至多包含2t-1个关键字,2t个指向子女的指针(叶子节点的子女为空)。(2) 节点的所有key按非降序存放,假设节点的关键字分别为K[1], K[2] … K[n], 指向子女的指针分别为P[1], P[2]…P[n+1],其中n为节点关键字转载 2014-06-15 08:33:01 · 735 阅读 · 0 评论 -
单链表反转C语言实现
单链表的反转可以使用循环,也可以使用递归的方式1.循环反转单链表循环的方法中,使用pre指向前一个结点,cur指向当前结点,每次把cur->next指向pre即可。 代码:# include # include using namespace std;struct linkNode{int val;linkNode *next;linkNode(int...原创 2014-07-05 09:51:03 · 16163 阅读 · 0 评论 -
容器适配器实现栈
C++中的适配器有三种,栈、队列和优先队列,这里介绍的是栈,使用这种容器适配器必须包含相应的头文件,# include ,默认情况下栈使用deque容器来实现的,要想改变其关联的容器,只要在第二个参数中指定即可,如stack > sta;这样就将关联容器改为了vector,栈适配器支持的关系操作符有 ==、!= 、、<=、>、 >=。栈适配器提供的操作有:1.empty()判断栈原创 2014-01-28 19:22:05 · 1223 阅读 · 0 评论