Для задания нам дается уравнение в обратной польской записи. Для этого примера я буду использовать: 2 3 8 * + $
$
для обозначения конца выражения. Используя стек, мы выводим ответ.
Я использовал:
getline(cin, input, '&');
input.c_str();
читать в уравнении, а затем превратить его в строку c_string, чтобы я мог посмотреть на отдельные элементы во входных данных.
После, мне нужно проверить несколько вещей. Если элемент является цифрой, мне нужно поместить его в стек. Если это пробел, мне нужно пропустить его.
if (isdigit(input[i]))
{
push();
i++;
}
else if (isspace(input[i]))
{
i++;
}
Вот что застряло у меня. Если я ударил оператора (в этом случае *
) Мне нужно вытолкнуть два верхних элемента из стека, «обработать их» и перенести результат обратно в стек. Однако я не знаю ничего, что позволило бы мне признать, что они являются операторами. Это, вероятно, глупый вопрос, но помощь будет принята с благодарностью.
Есть только около 4 или 5 операторов. проверьте их примерно так:
if (input[i] == '*') {...}
Вы могли бы создать функции карта, и соответствовать операторам
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);
}
Таким образом, вы сможете легко добавлять новых операторов в свой калькулятор.
Ну, нет никакого «встроенного» способа. Я бы просто написал функцию 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;
}
Если у вас есть операторы с несколькими символами, например ‘==’, это немного усложняется, потому что вы должны заглянуть вперед, но идея та же.
Если вы пишете калькулятор обратной польской нотации, то в стеке у вас есть только цифры или цифры, как в вашем примере. Кстати, вы не принимаете многозначные номера?
Рассмотрим два случая, в обоих нужно только 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();