所以我一直在寻找这个问题,但仍然无法掌握正在发生的事情。
一个队列是使用两个堆栈实现的,我理解这一点,但是当涉及到peek
函数时,我只是不知道它是如何工作的。例如,
template<class T>
T somethingsomething<T>::peek()
{
T potato;
if(outStack.isEmpty() == false)
{
potato = outStack.peek();
return potato;
}
else
{
/* stuff stuff stuff*/
}
}
在搞砸之后,我发现这个实现有效,但不知道为什么。当我做 outStack.peek()时,这不是对函数的递归调用吗?当我这样做时,代码中发生了什么以及它为什么起作用?
答案 0 :(得分:0)
此处没有递归调用,因为outStack
必须是实现 Stack 的某个类的实例,而somethingsomething
是实现<的一个类< em> Queue 使用两个堆栈。它们不能是同一个类,因此名为peek()的两个方法引用不同类的不同方法,尽管它们具有相同的名称。
答案 1 :(得分:0)
Peek通常意味着查看下一个字符,即它返回输入序列中的下一个字符。请记住,如果设置了任何内部标志,则它将返回EOF(文件结束)。请考虑以下示例了解peek函数。
#include <iostream>
using namespace std;
int main(){
cout<<"Enter a number: ";
int n;
cin>>ws;
int c = cin.peek();
if(c == EOF){ //checking for end of file
return 1;
}
if(isdigit(c)){
cin>>n;
cout<<"you entered: "<<n<<endl;
}
return 0;
}
因此,在你的情况下,马铃薯将从堆栈中返回下一个字符,你必须检查它与标志并将其存储在变量中,然后打印它。