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

时间:2011-09-01 12:49:14

标签: c++ search recursion stack

我一直在尝试编写一个搜索堆栈的递归函数,但是将堆栈保留为原始状态。我可能会脓 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 个答案:

答案 0 :(得分:9)

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

你的其他人应该看起来像这样:[除了它,看起来很好]

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|
---

第二个pop(),getNth():[再次,继续]

|3|
|4|
---

现在,当你检查s.top()== 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:
在评论中讨论之后,显然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;
   }
}