Тестировалось на:
Обычная запись | ОПЗ | Результат |
2-1+3*4 | 21-34*+ | 13 |
2-(1+3)*4 | 213+4*- | -14 |
(2-(1+3)*4)*5 | 213+4*-5* | -70 |
2-(1+3*4)*5 | 2134*+5*- | -63 |
Работу с стеком и разбор строки прикладываю в обработке.
Привожу основные функции:
//преобразование в ОПЗ
Пока лпСтрокаВход <> "" Цикл
лпТокен = ТокенПолучить(лпСтрокаВход);
лпТипТокена = ТокенТип(лпТокен);
Если лпТипТокена = "Число" Тогда
лпСтрокаВыход = лпСтрокаВыход + лпТокен + "!";
КонецЕсли;
Если лпТипТокена = "(" Тогда
СтекДобавить(лпСтек, "(");
КонецЕсли;
Если лпТипТокена = ")" Тогда
Пока СтекВершина(лпСтек) <> "(" Цикл
лпВершина = СтекВершина(лпСтек);
лпСтрокаВыход = лпСтрокаВыход + лпВершина + "!";
СтекУдалить(лпСтек);
КонецЦикла;
СтекУдалить(лпСтек);
КонецЕсли;
Если лпТипТокена = "Функция" Тогда
Пока (НЕ СтекПустой(лпСтек)) И (ДатьПриоритетОперации(лпТокен) >= ДатьПриоритетОперации(СтекВершина(лпСтек))) И СтекВершина(лпСтек) <> "(" Цикл
лпСтрокаВыход = лпСтрокаВыход + СтекВершина(лпСтек) + "!";
СтекУдалить(лпСтек);
КонецЦикла;
СтекДобавить(лпСтек, лпТокен);
КонецЕсли;
лпСтрокаВход = Сред(лпСтрокаВход, 2, 777);
КонецЦикла;
Пока НЕ СтекПустой(лпСтек) Цикл
лпСтрокаВыход = лпСтрокаВыход + СтекВершина(лпСтек) + "!";
СтекУдалить(лпСтек);
КонецЦикла;
пвПостфиксная = лпСтрокаВыход;
//вычисление через стек:
лпТекс = СтрЗаменить(лпСтрокаВход, "!", Символы.ПС);
Для Ит = 1 По СтрЧислоСтрок(лпТекс) Цикл
лпТокен = СтрПолучитьСтроку(лпТекс, Ит);
лпТипТокена = ТокенТип(лпТокен);
Если лпТипТокена = "Число" Тогда
СтекДобавить(лпСтек, Число(лпТокен));
КонецЕсли;
Если лпТипТокена = "Функция" Тогда
лпОператор2 = СтекВершина(лпСтек);
СтекУдалить(лпСтек);
лпОператор1 = СтекВершина(лпСтек);
СтекУдалить(лпСтек);
Если лпТокен = "+" Тогда
лпРезультат = лпОператор1 + лпОператор2;
КонецЕсли;
Если лпТокен = "-" Тогда
лпРезультат = лпОператор1 - лпОператор2;
КонецЕсли;
Если лпТокен = "*" Тогда
лпРезультат = лпОператор1 * лпОператор2;
КонецЕсли;
Если лпТокен = "/" Тогда
лпРезультат = лпОператор1 / лпОператор2;
КонецЕсли;
СтекДобавить(лпСтек, лпРезультат);
КонецЕсли;
КонецЦикла;