递归搜索堆栈,但保持堆栈不变

Posted

技术标签:

【中文标题】递归搜索堆栈,但保持堆栈不变【英文标题】:Search a stack recursively, but leave the stack intact 【发布时间】:2011-11-08 09:22:06 【问题描述】:

我一直在尝试编写一个递归函数来搜索堆栈,但使堆栈保持原始状态。我可能会流脓 h 并弹出堆栈,但不使用辅助堆栈或任何其他数据结构。

是的,这是作业,所以我不希望得到完整的编码答案:)。关于如何接近堆栈以便递归搜索完成后堆栈完好无损的一点帮助将不胜感激。

在堆栈中搜索指定项(但会破坏堆栈)的递归函数如下:

template <class Type>

Type getNth(stack(Type) & s, int n)



    if(s.empty())
        return -1;
    if(s.top() == n)
        return s.top();
    if(s.top() != n && s.empty())
        return -1;
    else
        s.pop();
        return getNth(s, n);

到目前为止,这有效。 非常感谢任何帮助

【问题讨论】:

+1 表示不希望别人为你做作业 :) 它与问题无关,所以我没有将其添加到答案中,但我认为您的最后一个 if 语句中有死代码,您永远无法输入它,因为 if s.empty () == true,则第一个 if 将被访问并返回 -1。 如果你不能使用堆栈作为辅助数据结构,那么你就不能使用递归:) @Seth Carnegie 这个问题清楚地表明我必须编写一个递归函数——并且我可能不会使用任何辅助堆栈或其他数据结构。这可能是问题中的错误吗? @Seth:+1。在任何理智的实施中都是如此。不过,链表、自修改代码等也都是可能的。 【参考方案1】:

在返回之前,您应该将pop()ed 值和递归调用结果以及push()pop()ed 值存储回来。

你的 else 应该看起来像这样:[除了它,它看起来不错]

else
    temp = s.pop();
    retVal =  getNth(s, n);
    s.push(temp);
    return retVal;

(*)原谅我没有声明tempretVal,你可以从中理解大致的想法..


编辑: 我决定添加一个简单的例子,假设你的堆栈是

|1|
|2|
|3|
|4|
---

你被调用 getNth(s,3): 这将发生在堆栈上 在第一次 pop() 和 getNth() 之后:[没有达到停止条件,所以继续]

|2|
|3|
|4|
---

2nd pop(),getNth(): [再次,继续]

|3|
|4|
---

现在,当您检查 s.top() == n 时,您会发现它们是!所以你返回 n。 从递归返回时,s.push(temp) 被调用,temp==2 被调用,所以我们得到:

|2|
|3|
|4|
---

我们再次返回 retVal,现在从递归中返回,我们再次使用s.push(),我们得到:

|1|
|2|
|3|
|4|
---

原始堆栈!并返回由递归返回的相同 returnVal!

注意:这不是您的问题,但函数的名称暗示您不想返回正在搜索的值,而是返回堆栈中的第 n 个元素, 意思是,如果你的堆栈是:

|5|
|8|
|8|
|8|
|2|
|4|
---

getNth(2) 将需要返回 8,而不是 2,如您的问题所述。 但我不可能确切地知道这一点,如果是这样,我认为你有足够的工具来处理这个问题而不会出现太多问题!

祝你好运!


编辑 2: 在 cmets 中讨论之后,很明显 OP 想要的东西与原始问题描述的有所不同,因此额外的编辑:

您的解决方案是搜索一个元素并返回它,可能您想要做的是 COUNT 直到这些元素,然后返回,应该是这样的 [再次,不声明所有变量,它不会编译,它是只是一个方向]:

template <class Type>
Type getNth(stack(Type) & s, int n)

    if(s.empty()) return -1;  //note that in C++ throwing an exception here will be more wise, since -1 might be not matching to Type
    else if(n == 0)  return s.top(); 
    else 
        temp = s.pop();
        retVal = getNth(s, n-1);
        s.push(temp);
        return retVal;
   

【讨论】:

@JAR:它与问题无关,所以我没有将它添加到答案中,但我认为你的最后一个 if 语句中有死代码,你永远不能输入它,因为如果s.empty() == true,则第一个 if 将被访问并返回 -1。 谢谢,这很快。但是,如果我在返回之前将 pop()ed 值推回,我最终不会得到相同的值吗? 哦,没看到 - 会检查一下 @JAR:我不确定我理解你的意思“我最终不会得到相同的值吗?” @amir 抱歉,我没有说清楚 - 如果我在弹出后直接推送弹出的值,我最终不会从堆栈中读取相同的元素吗?

以上是关于递归搜索堆栈,但保持堆栈不变的主要内容,如果未能解决你的问题,请参考以下文章

java中的递归和跨堆栈维护变量的状态

WPF UserControl:使多个链接的依赖项属性保持同步,而不会导致递归循环 堆栈溢出

如何在没有递归或堆栈但使用父指针的情况下按顺序遍历 BST?

递归执行广度优先搜索

如何将递归函数转换为使用堆栈?

在没有递归的情况下遍历非二叉树的算法是什么(使用堆栈)[重复]