Обратная польская запись. Обработка кода
Сейчас изучаю программы по вычислению постфиксной формы. Нашел такой пример. Вроде все понял, кроме одного. Где здесь строка ввода самого выражения?
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
#include <stack>
using std::stack;
int main() {
stack <int> stk;
bool isOk = true;
char c;
do {
//пропуск пробелов
while (c = cin.peek(), c == ' ' || c == '\t') cin.get();
//завершение обработки и выход из осн цикла
if (c == EOF || c == '\n' || c == '=') {
isOk = false;
cin.get();
}
else {
int t;
cin >> t;
if (cin.fail()) {
//получаем операнды
int a, b;
b = stk.top();
stk.pop();
a = stk.top();
stk.pop();
//вычисляем
switch (c) {
case '+':
a += b;
break;
case '-':
a -= b;
break;
case '*':
a *= b;
break;
case '/':
a /= b;
break;
default:
break;
}
stk.push(a);
//восстанавливаем чтение, выносим знак операции из потока ввода
cin.clear();
//пропуск считивыаемого знака операции, если за ним не идёт завершение обработки
if (c = cin.peek(), c != EOF && c != '\n' && c != '=') cin.get();
}
else
stk.push(t);
}
} while (isOk);
cout << stk.top() << endl;
system("pause");
return 0;
}
Ответы (1 шт):
Автор решения: Sergio
→ Ссылка
Вызовы cin.peek() / cin.get() / cin >> t требуют наличия данных в буффере ввода, и если их там нет, программа будет ждать ввода. То есть на первом же cin.peek() можно ввести всю строку.
Честно говоря мне не очень нравится такой подход так как он смешивает ввод данных и обработку.