Вычислить арифметическое выражение, хранящееся в постфиксной записи - 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выводятся результаты вычисления выражения. - Если в стеке осталось более одного элемента, выводится сообщение об ошибке.