Поэтому я искал этот вопрос, но все еще не могу понять, что происходит.
Очередь реализуется с использованием двух стеков, что я понимаю и все, но когда дело доходит до 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 (), разве это не рекурсивный вызов функции? Что происходит в коде, когда я делаю это и почему это работает?
Здесь нет рекурсивного вызова, потому что outStack
должен быть экземпляром некоторого класса, который реализует стек, в то время как somethingsomething
это класс, который реализует Очередь используя два стека. Они не могут быть одним и тем же классом, и поэтому два метода, называемых peek (), ссылаются на разные методы разных классов, хотя они имеют одно и то же имя.
Peek обычно означает просмотр следующего символа, т.е. он возвращает следующий символ во входной последовательности. Имейте в виду, что если установлен какой-либо внутренний флаг, он вернет EOF (конец файла). Рассмотрим следующий пример, чтобы понять функцию просмотра.
#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;
}
Таким образом, в вашем случае potato вернет следующий символ из стека, вы должны проверить его по флагу и сохранить в переменной, а затем распечатать.