В задаче кодирования, над которой я работал некоторое время, я пришел к этапу, когда мне нужно вычислить математическое выражение, которое выглядит так:
3 * 2 ^ 3 ^ 2 * 5
и должен оцениваться следующим образом:
3 * 2 ^ 3 ^ 2 * 5 = 3 * 2^(3 * 2) * 5 = 3 * 64 * 5 = 960.
В текущей форме моей реализации у меня есть два вектора, один из которых содержит операнды в виде целых чисел, а другой содержит операторы в виде символов.
Для текущего случая это будут: vector<int> operands = { 3, 2, 3, 2, 5 }
и vector<char> operators = { '*', '^', '^', '*' }
.
Это всего лишь пример, порядок операций может отличаться в том смысле, что умножение не всегда может быть первой/последней выполняемой операцией.
Я некоторое время застрял на этом конкретном шаге, а именно на вычислении выражения, инкапсулированного двумя векторными контейнерами, до целого числа. Я просмотрел некоторые математические синтаксические анализаторы, которые смог найти в Интернете, но до сих пор не понимаю, как реализовать правильную оценку.
Решение было бы очень признательно.
2^(3 * 2)
, а не2^(3^2)
? - person Robert Prévost   schedule 30.09.2016^
один раз оценивается как^
, а другой раз как*
? - person plasmacel   schedule 30.09.2016^
(или**
) был левоассоциативным. Это просто не так, в математике или в Python. - person Kyle Strand   schedule 30.09.2016(x ^ y) ^ z == x ^ (y * z)
, и похоже, что тот, кто написал этот вопрос для hackerrank, ошибочно полагает, что возведение в степень является левоассоциативным (как и большинство других математических операторов). - person Kyle Strand   schedule 30.09.2016