Вычислить значение произвольного выражения, представленного в обратной польской записи - C (СИ) (149115)
Формулировка задачи:
Вычислить значение произвольного выражения, представленного в обратной польской записи. Например:
обычная запись: (b+c)*d
обратная польская запись: bc+d*
Указания
Просматривая строку, анализировать очередной символ. Если это операнд, то записать его в стек; если это операция, то извлечь два элемента из стека, выполнить математическую операцию и занести результат в стек.
Решение задачи: «Вычислить значение произвольного выражения, представленного в обратной польской записи»
textual
Листинг программы
char stek[1000];
int ns = 0, res=0;
char Expr[] = "bc+d*";
int val[26]; // массив значений переменных a = val[0], b=val[1] ...
char *p;
for(p=Expr; *p; p++) {
if (*p=='*' || *p=='+') {
if (ns < 2) break;
if (*p=='+') stek[ns-2] = [stek[ns-1] + stek[ns-2];
else stek[ns-2] = stek[ns-1] * stek[ns-2];
ns--;
}
else {
if (*p <'a' || *p>'z') break;
stek[ns++] = val[*p];
}
}
if (*p || ns !=1) printf("Error");
else printf("res=%d", stek[0]);
Объяснение кода листинга программы
В этом коде реализована обработка выражений в обратной польской записи. Вот список действий, которые происходят в коде:
- Объявляются переменные:
stek- буфер для стека выражения,ns- счетчик стека,res- результат вычисления выражения,Expr- строка с обратной польской записью выражения,val- массив значений переменных.
- В цикле перебираются символы выражения:
- Если текущий символ
*или+, то выполняется вычисление скопированных в стек двух предыдущих значений с использованием операции сложения (+) или умножения (*). - Если текущий символ не является оператором (
*,+), то он помещается в стек.
- Если текущий символ
- Если выражение некорректно (например, если встречен недопустимый символ), то выводится сообщение об ошибке.
- Выводится результат вычисления выражения. Обратите внимание, что этот код не проверяет переполнение при вычислении выражения.