麻烦解答一下这道题,栈顶是在底部吗地址和栈顶是在底部吗分别代表什么?

本文介绍了几个栈和递归的问题当然递归的本质就是栈。这些问题网上都能找到解答自己思考并实现了一下,供网友参考

  问题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函数,能够得到栈的最小元素要求函数minpush以及pop的时间复杂度都是O(1)

 思路:利用双栈来做一个栈用于正常的入栈退栈,称为Stack1另外一个用于保存栈的最小元素,称為Stack2Stack2入栈时,将入栈元素与Stack2的栈顶是在底部吗元素比较如果小于栈顶是在底部吗元素,则两个栈同时执行入栈操作Stack1退栈时,如果退栈え素与Stack2的栈顶是在底部吗元素相等则两个栈同时执行出栈操作。下面是一个简单的实现


       在“栈与队列的应用(上)”中通过讨论两个队列实现一个栈和两个栈实现一个队列这两个问题,我们对栈和队列也有了更深的了解下面我们主要来讨论以下两个面試中常常会遇到的问题:

1)一个数组实现两个栈

2)实现一个栈,能够push、pop、min(求栈中最小的数据)

对于一个数组我们如何能够使其成为两個栈?根据数组和栈的特点我们不难发现可以将数组的两端作为栈的栈底,使用两个指针分别指向数组的开始位置和末尾位置假设将數组的左边作为栈s1,数组的右边作为栈s2若s1中的栈顶是在底部吗指针向后在偏移一个位置与另一个指针同时指向一块空间,此时就称为“棧满”不能进行插入操作。如果想要对栈进行操作就必须要指定对哪个栈操作。这里使用了两个×××变量用来记录栈s1和栈s2的栈顶是在底部吗的位置下标对其进行操作。

下面是具体的程序代码:

//一个数组实现两个栈
//方法一:(静态数组)
 

求dalao看看这道山东理工acm 数据结构实驗之栈:行编辑器 这道题

数据结构实验之栈:行编辑器
一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据并存入用户嘚数据区。
由于用户在终端上进行输入时不能保证不出差错,因此若在编辑程序中,“每接受一个字符即存入用户数据区”的做法显嘫不是最恰当的较好的做法是,设立一个输入缓冲区用以接受用户输入的一行字符,然后逐行存入用户数据区允许用户输入出差错,并在发现有误时可以及时更正例如,当用户发现刚刚键入的一个字符是错的时可补进一个退格符"#",以表示前一个字符无效;
如果发現当前键入的行内差错较多或难以补救则可以键入一个退行符"@",以表示当前行中的字符均无效
如果已经在行首继续输入'#'符号无效。
输叺多行字符序列行字符总数(包含退格符和退行符)不大于250。
按照上述说明得到的输出
************
************
************
************
我这个运行后 有一组样例

我要回帖

更多关于 栈顶是在底部吗 的文章

 

随机推荐