ВУЗ:
Составители:
93
Для записи любого выражения не нужны скобки. Так как оператор
непосредственно следует за операндами, участвующими в операции,
неопределенность в указании операндов отсутствует. Например, выражение
(A+B)+C имеет постфиксную форму AB+C+, а выражение A+(B+C)
представляется в форме ABC++.
К моменту считывания очередного оператора соответствующие
операнды уже были
прочитаны. Поэтому оператор может быть выполнен без
считывания каких-либо дополнительных данных.
Сказанное выше относится к бинарным операциям, однако это
нетрудно распространить на унарные операции. Так, унарный оператор
отрицания (эту операцию будем обозначать знаком ~) просто ставят
непосредственно за аргументом. Например, инфиксная запись ~A
представляется в форме A~, а выражение ~(A+B
) преобразуется в AB+~.
(Заметим, что знак "-" может стоять в инфиксной записи, указывая как
бинарную, так и унарную операцию, и его правильный смысл становится
очевидным из контекста. В постфиксной записи это сделать труднее.
Благодаря описанным выше свойствам выражение в постфиксной
форме может быть вычислено с помощью простого алгоритма:
while(lex != NULL) // пока в
выражении еще есть лексемы
{
lex = getNextLex(); // считать следующую лексему
if(isOperand(lex)) // лексема есть операнд
push(lex); // записать лексему в стек
if(isOperator(lex)) // лексема есть оператор
push(performOperation(lex, pop(), pop()));
/* выполнить указанную лексемой операцию над
последними элементами, записанными в стек, и заменить
эти элементы результатом операции;
*/
}
93 Для записи любого выражения не нужны скобки. Так как оператор непосредственно следует за операндами, участвующими в операции, неопределенность в указании операндов отсутствует. Например, выражение (A+B)+C имеет постфиксную форму AB+C+, а выражение A+(B+C) представляется в форме ABC++. К моменту считывания очередного оператора соответствующие операнды уже были прочитаны. Поэтому оператор может быть выполнен без считывания каких-либо дополнительных данных. Сказанное выше относится к бинарным операциям, однако это нетрудно распространить на унарные операции. Так, унарный оператор отрицания (эту операцию будем обозначать знаком ~) просто ставят непосредственно за аргументом. Например, инфиксная запись ~A представляется в форме A~, а выражение ~(A+B) преобразуется в AB+~. (Заметим, что знак "-" может стоять в инфиксной записи, указывая как бинарную, так и унарную операцию, и его правильный смысл становится очевидным из контекста. В постфиксной записи это сделать труднее. Благодаря описанным выше свойствам выражение в постфиксной форме может быть вычислено с помощью простого алгоритма: while(lex != NULL) // пока в выражении еще есть лексемы { lex = getNextLex(); // считать следующую лексему if(isOperand(lex)) // лексема есть операнд push(lex); // записать лексему в стек if(isOperator(lex)) // лексема есть оператор push(performOperation(lex, pop(), pop())); /* выполнить указанную лексемой операцию над последними элементами, записанными в стек, и заменить эти элементы результатом операции; */ }
Страницы
- « первая
- ‹ предыдущая
- …
- 91
- 92
- 93
- 94
- 95
- …
- следующая ›
- последняя »