【数据结构·考研】字符串相加与字符串相乘

415. 字符串相加给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/add-strings著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。解题思路:本题我们只需要对两个大整数模拟「竖式加法」的过程。对应位置的两个整数相加之后,如果当前位和超过 10,则向高位进一位。我们定义两个指针 i 和 j 分别指向 num1和 num2 的末尾,即最低位,
分类: 其他 发布时间: 09-14 23:33 阅读次数: 0

【数据结构·考研】共享栈

双栈共享一个栈空间为什么要使用共享栈:可能某一个栈空间不够用,总是需要扩容,而另一个栈 总是有空间闲置,将两个栈的空间共享。解决方式:将编号为 0 和 1 的两个栈存放于一个数组空间 V [m]中,栈底分别处于数组的两端。当第 0 号栈的栈顶指针 top [0] 等于-1 时该栈为空,当第 1 号栈的栈顶指针 top [1] 等于 m 时该栈为空。两个栈均从两端向中间增长。代码如下:#include<iostream>using namespace std;#defi.
分类: 其他 发布时间: 09-14 23:33 阅读次数: 0

【数据结构·考研】判断出栈序列是否正确

判断出栈序列题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。备注:例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。思路,考研中经常出现判断出栈序列是否合理的选择题,这样的题我们就是用入栈序列一边入栈,然后观察出栈序列的首元素,当入栈元素与出栈序列首元素相同时,就出栈,并且用入栈序列新的栈顶元素与出栈序列的第二个元素相比较,如果相同继续执行上述步骤,如
分类: 其他 发布时间: 09-14 23:32 阅读次数: 0

【数据结构·考研】有序链表的合并

有序链表的合并题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。输入:1->2->4, 1->3->4输出:1->1->2->3->4->4链表没有头结点。有序合并的思想类似归并排序。非递归的解决方式就是设置一个指针p一直标记着上一个合并完毕的结点的下一个结点,p在 l1 和 l2 之间来回移动,直到完成匹配。递归的解决方式就是不停的把确定新的有序链表下一个结点的任务交给下一层递归来完成,当两
分类: 其他 发布时间: 09-14 23:32 阅读次数: 0

【数据结构·考研】删除链表中等于给定值val的所有节点

删除链表中等于给定值val的所有节点备注:链表不带头结点。思路:非递归的解法,需要一个 pre 指针一直指到 val 值结点的上一个结点。但是考虑到链表没有头结点,所以如果首元结点的值为val,就直接头指针后移,然后释放上一个结点就行。递归的解法只需要设置一个指针,遍历完这个结点以后,把后续的任务交给下一层来完成,每一层都在删除完 val 结点后直接把上一层的 next 域改为了 val 值结点的下一个结点的地址,完成了删除后的链接。#include<iostream>#in
分类: 其他 发布时间: 09-14 23:32 阅读次数: 0

【数据结构·考研】验证回文串

验证回文串说明:回文串是一个正读和反读都一样的字符串,我们将空字符串定义为有效的回文串。示例:输入: "level", 输出: true。最基本的回文串问题,可以用双指针分别由前往后检索和由后往前检索,如果最后相遇则是回文串。可以利用一个栈来通过压入前半段,来判断后半段;或者全部压入,再与字符串从后往前比较。也可以利用递归的来做,与双指针的思想实际一模一样。代码如下:#include<iostream>#include<stack>#include<c
分类: 其他 发布时间: 09-14 23:32 阅读次数: 0

【数据结构·考研】循环队列处理队满和队空的三种方式

循环队列处理队满和队空的方式顺序存储的队列在队满时再进队出现的溢出往往是假溢出,即还有空间但用不上,为了有效利用队列空间,可将队列元素存放数组首尾相接,形成循环队列。但是构造循环队列时不得不考虑到的问题就是如果不加以限制,队空和队满的情况是相同的。即队头指针和队尾指针的指向相同。一般来说有以下三种解决方式:1、牺牲一个单元来区分队空和队满,也是普遍在利用的方式。队满:(rear + 1)% QueueSize == front队空:front == rear队长:(rear -
分类: 其他 发布时间: 09-14 23:31 阅读次数: 0

【数据结构·考研】进制转换

任意进制转换输入一个十进制数N,将它转换成R进制数输出。2<=R<=16, R<>10,如果R大于10,则对应的数字规则参考16进制(比如10用A表示,等等)。因为除余的顺序和输出的顺序是相反的,可以想到用栈来解决。代码如下:#include<iostream>#include<stack>#include<cmath>using namespace std;void conversion(int N,int R) {
分类: 其他 发布时间: 09-14 23:31 阅读次数: 0

【深搜】Lake Counting

Lake Counting(POJ No.2386)有一个大小为 N * M 的园子,雨后积了水。八连通的积水被认为是连接在一起的。请求出园子里总共有多少水洼?N = 10,M = 12园子如下图(‘ W ’表示积水,‘ . ’表示没有积水)W........WW..WWW.....WWW....WW...WW..........WW..........W....W......W...W.W.....WW.W.W.W.....W..W.W......W.
分类: 其他 发布时间: 09-14 23:31 阅读次数: 0

【递归】斐波那契递归的优化

递归版本:int fib(int n){ if(n == 1||n == 2) return 1; return fib(n-1) + fib(n-2);}记忆化搜索优化:int memo[100];int fib(int n){ if(n == 1||n == 2) return 1; if(memo[n] != 0) return memo[n]; return memo[n] = fib(n-1) + fib(n-2);}动态规划优化:int fib(int
分类: 其他 发布时间: 09-14 23:31 阅读次数: 0

【数据结构·考研】队列实现杨辉三角的打印

队列实现杨辉三角的打印也可以叫做队列打印二项式系数。思路:队列可以实现第 i 行数据计算并存放第 i+1 行数据,第 i 行每个元素出队都会有新的第 i+1 元素入队。我们设置一个 s 和 t 表示两个数字相加,以此得到新的一行中的数字。杨辉三角的第 i+1 行总是比第 i 行多1个元素,我们可以通过在每一行末尾补0来实现这种每行数字个数的增长,同时也解决了每一行第一个数字的来源,即由上一行的上一行末尾的 0 和上一行第一个数字 1 相加而来。s 不停被赋值为 t 的前一个元素,每出队一个
分类: 其他 发布时间: 09-14 23:30 阅读次数: 0

【数据结构·考研】先序构造二叉树

在跑程序构造一棵二叉树时,我们经常使用先序构造的方式。先创建一个结点赋值,然后再递归的构造它的左右子树。例如我们约定好以' # '结束输入,构造下面形状的一棵二叉树:/*------------树的形状: a b c d e f --------------*/我们以先序的方式输入这棵树:a b d # # e # # c f # # #,最后以层次的方式展示出来。代码如下:#include<iostream>#include<
分类: 其他 发布时间: 09-14 23:30 阅读次数: 0

【数据结构·考研】前序遍历二叉树

前序遍历二叉树前序遍历二叉树的方式是 LVR 即左 - 根 - 右。一般有递归和非递归两种方式,递归的方式就是先访问父结点,然后递归的访问左子树,再递归的访问右子树。非递归在访问完父节点后先把右子树压栈,再把左子树压栈,然后栈非空的条件下继续迭代访问,与递归前序的思想完全相同。依旧是这棵老树:/*------------树的形状: a b c d e f --------------*/代码如下:#include<iostream>
分类: 其他 发布时间: 09-14 23:30 阅读次数: 0

【数据结构·考研】中序遍历二叉树

中序遍历二叉树中序遍历二叉树的非递归实现:先不停往左孩子方向走,一边往左走一边入栈,等走到尽头后输出一个结点来访问,然后走向这个结点的右孩子。在右孩子结点非空或栈非空的状态下,不停迭代上述过程。#include<iostream>#include<stack>#include<queue>using namespace std; typedef struct node{ char val; struct node* left; struct
分类: 其他 发布时间: 09-14 23:30 阅读次数: 0

【数据结构·考研】后序遍历二叉树

后序遍历二叉树递归的后序遍历二叉树还是和之前一样,调整一下输出语句就可以。非递归有两种方式,一种是规规矩矩的类似中序的迭代,另一种是通过倒序输出镜像前序的序列来得到后序序列。依旧是那棵老树:/*------------树的形状: a b c d e f --------------*/代码如下:#include<iostream>#include<queue>#include<stack>using nam
分类: 其他 发布时间: 09-14 23:29 阅读次数: 0

【数据结构·考研】层次遍历二叉树

层次遍历(广度优先遍历)二叉树广度优先遍历在图和树中都被用来寻找最短路径,它每次会寻找一个离自己最近的结点,用队列来实现。先把根节点进队,然后每出队一个结点,它的左右结点进队,直到队为空。代码如下:#include<iostream>#include<queue>using namespace std;typedef struct node{ char val; struct node* left; struct node* right;}TreeNod
分类: 其他 发布时间: 09-14 23:29 阅读次数: 0

【数据结构·考研】二叉树的高度(深度)

二叉树的高度(深度)二叉树的高度和深度其实是相同的东西。自下向上称作计算高度,由上到下称为计算深度。求二叉树的深度也有递归和非递归的方法。递归的方法就是一直递归到树的最边缘,通过比较当前左右子树的高度,取大的一方+1继续向上累积,直到比较到根节点的左右子树高度,然后取大的一棵+1就是最后树高。而非递归的方式是利用到树的层次遍历,每遍历一层+1,直到遍历完整棵树。代码如下:#include<iostream>#include<queue>using namespace
分类: 其他 发布时间: 09-14 23:29 阅读次数: 0

【数据结构·考研】二叉树的宽度

二叉树的最大宽度求二叉树的宽度,我们首先想到他是广度(宽度)优先遍历的专利,记录每层结点数,取最大返回就是二叉树的宽度,如果我们想要用非递归的办法来解决的话,就需要设置一个数组来存储每层的结点数,然后引用一个 max 来记录最大结点数。这样的话就是相当于把非递归强行写成了递归,递归只起到了遍历的作用,所以此时更新 max 的时机可以是前中后任何一个地方。代码如下:#include<iostream>#include<queue>#include<vector&
分类: 其他 发布时间: 09-14 23:29 阅读次数: 0

【数据结构·考研】二叉树叶子结点的个数

二叉树叶子结点的个数非递归的求法,用广度优先遍历,每出队一个结点,判断它是不是叶子结点。非递归的做法,先由上自下遍历,等遍历到叶子处再逐层返回左右子树的叶子结点总和,最后得到整棵树的叶子结点数。代码如下:#include<iostream>#include<queue>#include<vector>using namespace std;typedef struct node{ char val; struct node* left; st
分类: 其他 发布时间: 09-14 23:28 阅读次数: 0

【数据结构·考研】二叉树的结点个数

二叉树的结点个数非递归的求法很简单,每出队一个结点,count++。递归的解法,从上自下遍历到最底端,返回左右子树结点数+1,代表左右子树的结点再加上父结点的个数。代码如下:#include<iostream>#include<queue>#include<vector>using namespace std;typedef struct node{ char val; struct node* left; struct node* righ
分类: 其他 发布时间: 09-14 23:28 阅读次数: 0