петли — плюс знак выхода из переполнения стека

Привет, ребята, я испытываю трудности с плюсом при получении информации. Здесь я имею дело с калькулятором обратной польской записи. что мне нужно, это принять входные данные как «3 2 + $», что означает (простым способом) добавить 3 и 2 и показать их. я пытался использовать stringstreams, в то время как (cin). сейчас я пытаюсь получить вход по одному;

int num;
char ch;
while (cin)
{
if (cin >> num)
{
cout<<num;
}
else
{
cin.clear();
cin >> ch;
cout << ch;
}
}
}

это не работает для + и — и работает для * и /. но мне тоже нужны эти операнды. я попробовал istringstream с помощью getline. он не видел + или — либо.

0

Решение

В вашем примере кода эта строка беспокоит меня while (cin) (должен быть уверен, что у вас будет бесконечный цикл), в приведенном ниже примере кода (я добавил, что при вводе пустой строки программа заканчивается).

cin получит ввод одно слово за одним словом, когда вы пишете в консоли 3 2 + $ когда ты звонишь cin >> somevariable; получил бы 4 результата: 3 затем 2 затем + и последний $. Другая проблема при чтении польской нотации состоит в том, что вы не можете предсказать, будет ли следующий токен числом или оператором, вы можете получить: 3 2 + $ но 3 2 2 + * $ тоже. По этой причине вам нужен контейнер для хранения операндов.

Вот небольшой рабочий пример:

#include <iostream>
#include <stack>
#include <boost/lexical_cast.hpp>

using namespace std;

int main(int argc, char *argv[]) {
string read;
std::stack<int> nums;
while (cin >> read) {
if (read.empty()) {
break;
}
else if (read == "$") {
std::cout << nums.top() << std::endl;
}
else if (read == "+" || read == "-" || read == "*" || read == "/") {
if (nums.size() < 2) {
} // error code here

int n1 = nums.top();
nums.pop();
int n2 = nums.top();
nums.pop();

if (read == "+")
nums.push(n2 + n1);
if (read == "-")
nums.push(n2 - n1);
if (read == "*")
nums.push(n2 * n1);
if (read == "/")
nums.push(n2 / n1);
}
else {
try {
nums.push(boost::lexical_cast<int>(
read)); // you should add convertion excepcion code
}
catch (...) {

}
}
}

return 0;
}
2

Другие решения


По вопросам рекламы [email protected]