我一直在尝试编写一个搜索堆栈的递归函数,但是将堆栈保留为原始状态。我可能会脓 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);
}
到目前为止,这是有效的。 任何帮助非常感谢
答案 0 :(得分:9)
在返回之前,您应该存储pop()
ed值和递归调用结果以及push()
pop()
ed值。
你的其他人应该看起来像这样:[除了它,看起来很好]
else
temp = s.pop();
retVal = getNth(s, n);
s.push(temp);
return retVal;
(*)请原谅我没有声明temp
和retVal
,你可以理解这个概念..
编辑: 我决定添加一个简单的例子,假设你的堆栈是
|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;
}
}