поиск строки для операторов

Для задания нам дается уравнение в обратной польской записи. Для этого примера я буду использовать: 2 3 8 * + $ $ для обозначения конца выражения. Используя стек, мы выводим ответ.

Я использовал:

getline(cin, input, '&');
input.c_str();

читать в уравнении, а затем превратить его в строку c_string, чтобы я мог посмотреть на отдельные элементы во входных данных.

После, мне нужно проверить несколько вещей. Если элемент является цифрой, мне нужно поместить его в стек. Если это пробел, мне нужно пропустить его.

if (isdigit(input[i]))
{
push();
i++;
}
else if (isspace(input[i]))
{
i++;
}

Вот что застряло у меня. Если я ударил оператора (в этом случае *) Мне нужно вытолкнуть два верхних элемента из стека, «обработать их» и перенести результат обратно в стек. Однако я не знаю ничего, что позволило бы мне признать, что они являются операторами. Это, вероятно, глупый вопрос, но помощь будет принята с благодарностью.

2

Решение

Есть только около 4 или 5 операторов. проверьте их примерно так:

if (input[i] == '*') {...}
0

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

Вы могли бы создать функции карта, и соответствовать операторам

std::map<char, void (*)(char *)> operators;

operators['*'] = &mult;
operators['+'] = &add;
...

и в вашем условном заявлении

if (isdigit(input[i]))
{
push();
i++;
}
else if (isspace(input[i]))
{
i++;
}
else if (operators.find(input[i]) != operators.end())
{
operators[input[i]](input);
}

Таким образом, вы сможете легко добавлять новых операторов в свой калькулятор.

1

Ну, нет никакого «встроенного» способа. Я бы просто написал функцию IsOperator (char ch). А затем сделать что-то вроде:

int IsOperator(char ch)
{
// either add more operators or use a table, etc. here
if (ch == '+' || ch == '-' || ch == '/' || ch == '*')
return 1;

return 0;
}

Если у вас есть операторы с несколькими символами, например ‘==’, это немного усложняется, потому что вы должны заглянуть вперед, но идея та же.

0

Если вы пишете калькулятор обратной польской нотации, то в стеке у вас есть только цифры или цифры, как в вашем примере. Кстати, вы не принимаете многозначные номера?

Рассмотрим два случая, в обоих нужно только std::stack<int> numbers;:

  • У вас есть цифровой символ c — просто положите номер в стек:

код:

numbers,push(c - '0');
  • У вас есть оператор, скажем, «+», вы заменяете два верхних числа их суммой:

код:

 if (numbers.size() < 2) {
throw std::runtime_error("Too little numbers for +");
}
int a = numbers.top();
numbers.pop();
numbers.top() += a;
  • У вас есть ‘$’, проверьте, есть ли в стеке только одно число, это результат:

код:

  if (numbers.size() != 1) {
throw std::runtime_error("There should be only one!");
}
int result = numbers.top();
numbers.pop();
0
По вопросам рекламы [email protected]