Quando andaste na escola primária, aprendeste que os diferentes operadores aritméticos têm diferentes precedências.
Isso acontece em todos os países, e por exemplo os ingleses usam a mnemónica: "Please Excuse My Dear Aunt Sally", que indica a ordem dos operadores (Parenteses, Exponenciação, Multiplicação, Divisão, Adição, Subtração).
Por exemplo, a expressão:
1 + 2 x 3 = ?dá como resultado 7, pois o operador multiplicação tem precedência.
Se quiseremos avaliar primeiro a soma a expressão tem de ser:
(1 + 2) x 3 = ?No entanto, nos tempos iniciais das calculadoras electrónicas, revelou-se complicado analisar este tipo de expressões.
Por isso mesmo, em 1920, o matemático polaco Jan Lukasiewicz criou uma notação que tornava desnecessário o uso de parenteses, garantindo sempre que as operações eram efectuadas como desejado. A notação consistia basicamente em escrever os operadores antes dos números e não no meio deles.
Já em 1950, o computer scientist Charles L. Hamblin propôs um esquema onde os operadores
apareciam a seguir aos números, em vez de ser antes. Esta notação acabou por ser muito usada, devido entre
outras coisas à sua fácil implementação num sistema automático usando uma pilha, e ficou conhecida como
Notação Polaca Invertida (RPN) (ou postfix). Em RPN, uma expressão arbitrariamente
complexa pode ser escrita sem o uso de parenteses.
Notação Normal | Notação Polaca Invertida (RPN) |
---|---|
1 + 1 | 1 1 + |
3 * (4 + 5) | 3 4 5 + * |
3 + 4 * 5 | 3 4 5 * + |
A tua tarefa é criar um programa capaz de calcular o valor final de expressões dadas em RPN, sabendo que um algoritmo para as analisar é:
A primeira linha contém um número N (1≤N≤10), indicando o número de expressões a analisar.
As seguintes N linhas contêm expressões RPN, contendo
Podes assumir que os números são sempre inteiros positivos menores que 231, que os cálculos intermédios vão dar sempre números inteiros menores que 231, e que só aparecem os quatro tipos básicos de operações atrás citados.
Uma linha para cada expressão, indicando o resultado final caso a expressão seja correcta, ou Expressao Incorrecta, caso contrário.
Input | Output |
---|---|
7 1 1 + 3 4 5 + * 3 4 5 * + 1 + 1 1 1 + 2 3 8 2 / - 1 + * 22 20 + |
2 27 23 Expressao Incorrecta Expressao Incorrecta 0 42 |
Algoritmos e Estruturas de Dados (L.EIC011)
DCC/FCUP - Faculdade de Ciências da Universidade do Porto
DEI/FEUP - Faculdade de Engenharia da Universidade do Porto