本文介绍了几个栈和递归的问题当然递归的本质就是栈。这些问题网上都能找到解答自己思考并实现了一下,供网友参考
问题1:跳台阶问题。具体描述一个台阶總共有n级,如果一次可以跳1级也可以跳2级。求总共有多少总跳法并分析算法的时间杂度。
思路:简单分析一下这道题不难。假设f(n)为問题的解从后往前推,最后一跳有两种情况一是跳1级,二是跳2级可以得出这个式子 f(n) = f(n-1) + f(n-2),其中f(1)=1f(2)=2。递归实现如下当然也可以用迭代。
問题2:栈的push、pop序列具体描述,输入两个整数序列其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序为了简单起見,我们假设push序列的任意两个整数都是不相等的
思路:用一个辅助栈。依次检查push序列的每个元素如果该元素不等于pop序列的当前元素,則将这个元素压栈;如果相等则检查push序列的下一个元素,同时pop序列的当前元素往前移1个最后将辅助栈中的元素退栈,并与pop序列进行比較最后辅助栈的元素为空,并且pop序列的当前位置为最后元素的下一个位置则这个序列是pop序列。
问题3:二元树的深度输入一棵二元树嘚根结点,求该树的深度从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度例如:輸入二元树:
输出该树的深度3。二元树的结点定义如下:
思路:这是一道关于树的题目很多树的问题都是用递归解决的。比如“”、“”、“”等这个问题也不例外,只要递归求结点的左右子树的深度树的深度为 = 1 + max{ 根节点左子树深度,根结点右子树深度}思路:这道题純粹是为了加深递归的理解。用两个递归来做
问题5:设计包含min函数的栈。定义栈的数据结构要求添加一个min函数,能够得到栈的最小元素要求函数min、push以及pop的时间复杂度都是O(1)。
思路:利用双栈来做一个栈用于正常的入栈退栈,称为Stack1另外一个用于保存栈的最小元素,称為Stack2Stack2入栈时,将入栈元素与Stack2的栈顶是在底部吗元素比较如果小于栈顶是在底部吗元素,则两个栈同时执行入栈操作Stack1退栈时,如果退栈え素与Stack2的栈顶是在底部吗元素相等则两个栈同时执行出栈操作。下面是一个简单的实现