давай посмотрим, смогу ли я сломать это для тебя. Алгоритм маневрового двора выполняет одно из следующих действий, нарушая инфиксную нотацию:
- либо создает строку постфиксной нотации (также известную как нотация Reverse Poli sh)
- или абстрактный синтаксис дерево.
В вашем случае это постфиксная нотация.
[примечание: я надеюсь, вы знаете о постфиксной нотации, если нет, то прочтите this .]
Теперь, постфиксная нотация позволяет очень легко вычислять математические выражения. Я покажу вам, как оценить постфиксную нотацию:
In a simple description:
(1) Infix: A + B
Postfix: A B +
(2) Infix: A + B * C
Postfix: A B C * +
Let's observe the part A+B*C i.e. A+(B*C)
If we represent it in Postfix, it would be like: A B C * +(by applying shunting-yard)
Now, the algorithm to calculate it
(1) Take a stack
(2) When we see a number, we push it to stack
(3) When we see a operator, we pop two numbers out of stack and calculate them with help of operator and push the result into stack again
(4) We do it till the end
(5) At last, only a number would be left in stack, that is our answer.
Let's visualise it:
(1) [A]
(2) [A, B]
(3) [A, B, C]
(4) [A, R1] where R1 = B*C
(5) [R2] where R2 = A+R1
Надеюсь, вы поняли, что маневровая площадка поможет вам преобразовать инфикс в постфикс, а затем, вы можете легко оценить постфиксную нотацию.
Теперь вопрос в том, как обнаружить a++b
ошибку :
Теперь посмотрите, что происходит для a, +, + , b токенов (как вы указали в комментарии: a++b
- это токены a, +, +, b):
Я взял псевдокод из википедии (ленился, не хотел написать себя):
else if the token is an operator then:
while ((there is a operator at the top of the operator stack)
and ((the operator at the top of the operator stack has greater precedence)
or (the operator at the top of the operator stack has equal precedence and the token is left associative))
and (the operator at the top of the operator stack is not a left parenthesis)):
pop operators from the operator stack onto the output queue.
push it onto the operator stack.
в соответствии с этим: a, +, +, b будут иметь следующую форму в очереди вывода:
a, b, +, +
a, b, +, +
просто неправильно , потому что, согласно правилам оценки постфикса, будет происходить следующее:
1. [a] // output queue is now [b, +, +]
2. [a, b] // output queue is now [+, +]
3. [r1] // output queue is now [+]
4. error // cause: notice there's still one '+' operator left in queue
// but, only one number 'r1' left in the 'stack'
// so, error
Надеюсь, теперь вам ясно ...