Вычислить арифметическое выражение, хранящееся в постфиксной записи - Pascal
Формулировка задачи:
Динамические структуры. Стеки. Требуется вычислить арифметическое выражение, хранящегося в постфиксной записи. В выражение входят целые числа и знаки + , - .
Требуется использовать алгоритм: В строке находится выражение 5 4 8 - + если это число, тогда записывается в стек, если знак то из стека вынимаем 2 последних числа и делаем с ним сложение или вычитание в зависимости от знака, что получилось записываем обратно в стек, идем дальше, стоит знак , снова достаем 2 числа и делаем вычисление, записываем обратно в стек, если стока пуста, тогда выводим всё, что находится в стеке, если это одно число тогда выводим его на экран, иначе если там 2 и более, выводим на экран эти 2 и более чисел и пишем, что выражение было записано не верно.
Решение задачи: «Вычислить арифметическое выражение, хранящееся в постфиксной записи»
textual
Листинг программы
var s: string; st: array[1..255] of integer; sz, i, tmp: integer; flg: boolean; procedure err(s: string); begin writeln(s); exit end; begin read(s); flg := false; for i := 1 to length(s) do if (s[i] in ['0'..'9']) then begin tmp := tmp * 10 + ord(s[i]) - 48; flg := true; end else if s[i] = '+' then if sz < 2 then err('Ошибка! В стеке меньше двух элементов') else begin dec(sz); st[sz] := st[sz] + st[sz + 1] end else if s[i] = '-' then if sz < 2 then err('Ошибка! В стеке меньше двух элементов') else begin dec(sz); st[sz] := st[sz] - st[sz + 1] end else if s[i] <> ' ' then err('Ошибка! Неопознанный символ') else if flg then begin flg := false; inc(sz); st[sz] := tmp; tmp := 0 end; for i := 1 to sz do write(st[i]); if sz > 1 then err('Ошибка! Выражение было записано не верно'); end.
Объяснение кода листинга программы
- Переменная
s
предназначена для хранения строки, в которой содержится арифметическое выражение. - Переменная
st
представляет собой массив целых чисел, в котором будут храниться результаты вычисления выражения. - Переменная
sz
используется для контроля количества элементов в стеке. - Переменная
i
используется для итерации по символам строкиs
. - Переменная
tmp
используется для временного хранения результата вычисления выражения. - Переменная
flg
используется для контроля правильности записи выражения. - Функция
err
используется для вывода сообщения об ошибке. - В цикле
for
происходит обработка каждого символа строкиs
. - Если текущий символ является числом от 0 до 9, то он умножается на 10, к нему добавляется код символа, вычитаемый из 48, и результат записывается в переменную
tmp
. Затем флагflg
устанавливается вtrue
, чтобы можно было продолжить выполнение программы. - Если текущий символ - это знак
+
, то из стека удаляется максимум два элемента, и их суммы записываются в переменнуюtmp
. Затем флагflg
устанавливается вtrue
. - Если текущий символ - это знак
-
, то из стека удаляется максимум два элемента, и их разности записываются в переменнуюtmp
. Затем флагflg
устанавливается вtrue
. - Если текущий символ не является числом или знаком, то выводится сообщение об ошибке.
- После обработки всех символов строки
s
выводятся результаты вычисления выражения. - Если в стеке осталось более одного элемента, выводится сообщение об ошибке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д