<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D1%8C%D1%81%D0%BA%D0%B0%D1%8F_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C</id>
	<title>Обратная польская запись - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D1%8C%D1%81%D0%BA%D0%B0%D1%8F_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C"/>
	<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D1%8C%D1%81%D0%BA%D0%B0%D1%8F_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C&amp;action=history"/>
	<updated>2026-07-19T10:51:07Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D1%8C%D1%81%D0%BA%D0%B0%D1%8F_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C&amp;diff=12212&amp;oldid=prev</id>
		<title>imported&gt;Master-lame-master в 13:01, 23 июня 2025</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D1%8C%D1%81%D0%BA%D0%B0%D1%8F_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C&amp;diff=12212&amp;oldid=prev"/>
		<updated>2025-06-23T13:01:46Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{не путать|Польская нотация|(прямой) польской нотацией}}&lt;br /&gt;
{{Математические нотации|logo=[[Файл:Postfix-dia.svg|125px]]}}&lt;br /&gt;
[[Файл:Typing the calculation for &amp;quot;8 times 6&amp;quot; into a pocket calculator HP-32SII which uses RPN logic.webm|thumb|upright|Нажатие клавиш для расчета восемь раз по шесть на HP-32SII (с использованием RPN) 1991 г.]]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Обра́тная по́льская за́пись&amp;#039;&amp;#039;&amp;#039; ({{lang-en|Reverse Polish notation, RPN}}), также известна как &amp;#039;&amp;#039;&amp;#039;по́стфиксная нота́ция&amp;#039;&amp;#039;&amp;#039; (запись) — форма записи [[Математическое выражение|математических]] и [[Логическое выражение|логических]] выражений, в которой [[операнд]]ы расположены перед знаками [[Операция (программирование)|операций]]. Также именуется как &amp;#039;&amp;#039;обратная бесскобочная запись&amp;#039;&amp;#039;, &amp;#039;&amp;#039;постфиксная нотация&amp;#039;&amp;#039;, &amp;#039;&amp;#039;бесскобочная символика Лукасевича&amp;#039;&amp;#039;, &amp;#039;&amp;#039;польская инверсная запись&amp;#039;&amp;#039;, &amp;#039;&amp;#039;ПОЛИЗ&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Стековой машиной&amp;#039;&amp;#039;&amp;#039; называется алгоритм, проводящий вычисления по обратной польской записи (см. ниже &amp;#039;&amp;#039;[[#Пример вычисления выражений|пример вычисления выражений]]&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
== История ==&lt;br /&gt;
Обратная польская нотация (ОПН) была разработана [[Австралия|австралийским]] [[философия|философом]] и специалистом в области [[теория вычислительных машин|теории вычислительных машин]] [[Хэмблин, Чарльз|Чарльзом Хэмблином]] в середине 1950-х на основе [[Польская нотация|польской нотации]], которая была предложена в 1920 году польским математиком [[Лукасевич, Ян|Яном Лукасевичем]]. Работа Хэмблина была представлена на конференции в июне 1957 и издана в 1957 и 1962.&lt;br /&gt;
&lt;br /&gt;
Первыми компьютерами, поддерживающими обратную польскую нотацию, были [[KDF9]] от [[English Electric Company]], который был анонсирован в 1960 и выпущен (появился в продаже) в 1963, и [[США|американский]] [[Burroughs B5000]], анонсирован в 1961, выпущен в том же 1963. Один из проектировщиков B5000, {{s|Р. С. Бартон}}, позже написал, что разработал обратную польскую запись независимо от Хэмблина, примерно в 1958, в процессе чтения книги по [[символьная логика|символьной логике]], и до того как познакомился с работой Хэмблина.&lt;br /&gt;
&lt;br /&gt;
Компания [[Friden]] перенесла ОПН в настольные [[калькулятор]]ы, выпустив в июне 1964 модель EC-130. А в 1968 инженеры [[Hewlett-Packard]] разработали настольный калькулятор [[HP 9100A|9100A]] с поддержкой ОПН. Этот калькулятор сделал обратную польскую нотацию популярной среди учёных и инженеров, даже несмотря на то, что в ранней рекламе 9100A ОПН не упоминалась. В 1972 калькулятор [[HP-35]] с поддержкой ОПН стал первым научным карманным калькулятором.&lt;br /&gt;
&lt;br /&gt;
В 1971 году появился оригинальный [[язык программирования]] [[Forth]], языковая машина которого имеет двухстековую структуру и где все вычисления проводятся на [[стек]]е. В этом языке ОПН является естественным способом записи любых операций с данными, хотя возможна, при желании, реализация и обычной ([[Инфиксная нотация|инфиксной]]) записи арифметических операций.&lt;br /&gt;
&lt;br /&gt;
ОПН применялась в советском инженерном калькуляторе Б3-19М (совместная разработка с ГДР), выпущенном в 1976 году. Все выпускаемые в [[СССР]] вплоть до конца 1980-х годов [[калькулятор|программируемые микрокалькуляторы]], за исключением «[[Электроника МК-85]]» и «[[Электроника МК-90]]», использовали ОПН — она проще реализовывалась и позволяла обойтись в программировании вычислений меньшим числом команд, по сравнению с обычной алгебраической нотацией, а количество программной памяти в этих моделях всегда было критическим ресурсом. ОПН используется в современных российских программируемых калькуляторах «[[Электроника МК-152]]» и «[[Электроника МК-161]]», что обеспечивает их совместимость с программами, написанными для советских калькуляторов.&lt;br /&gt;
&lt;br /&gt;
== Определение ==&lt;br /&gt;
Чтобы дать индуктивное определение постфиксной нотации&amp;lt;ref&amp;gt;А. В. Ахо, Р. Сети, Д. Д. Ульман. &amp;#039;&amp;#039;Компиляторы: принципы, технологии и инструменты.&amp;#039;&amp;#039; М.: «Вильямс», 2003. С. 51.&amp;lt;/ref&amp;gt;, обозначим выражения в инфиксной нотации &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;, эквивалентные им выражения в постфиксной нотации &amp;lt;math&amp;gt;\dot E&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;\dot E_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\dot E_2&amp;lt;/math&amp;gt; соответственно; &amp;lt;math&amp;gt;o&amp;lt;/math&amp;gt; — произвольный бинарный оператор, тогда:&lt;br /&gt;
&lt;br /&gt;
1. Если &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; — переменная или константа, то &amp;lt;math&amp;gt;\dot E&amp;lt;/math&amp;gt; есть &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Если &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; — выражение вида &amp;lt;math&amp;gt;E_1 o E_2&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\dot E&amp;lt;/math&amp;gt; есть &amp;lt;math&amp;gt;\dot E_1 \dot E_2 o&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. Если &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; — выражение вида &amp;lt;math&amp;gt;(E_1)&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\dot E&amp;lt;/math&amp;gt; есть &amp;lt;math&amp;gt;\dot E_1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Описание ==&lt;br /&gt;
Отличительной особенностью обратной польской нотации является то, что все аргументы (или [[операнд]]ы) расположены перед знаком операции. В общем виде запись выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
* Запись набора операций состоит из последовательности операндов и знаков операций. Операнды в выражении при письменной записи разделяются пробелами.&lt;br /&gt;
* Выражение читается слева направо. Когда в выражении встречается знак операции, выполняется соответствующая операция над двумя последними встретившимися перед ним операндами в порядке их записи. Результат операции заменяет в выражении последовательность её операндов и её знак, после чего выражение вычисляется дальше по тому же правилу.&lt;br /&gt;
* Результатом вычисления выражения становится результат последней вычисленной операции.&lt;br /&gt;
&lt;br /&gt;
Например, рассмотрим вычисление выражения &amp;lt;code&amp;gt;{{s|7 2 3 * −}}&amp;lt;/code&amp;gt; (эквивалентное выражение в инфиксной нотации: &amp;lt;code&amp;gt;{{s|7 − 2 * 3}}&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Первый по порядку знак операции — «*», поэтому первой выполняется операция умножения над операндами 2 и 3 (они стоят последними перед знаком). Выражение при этом преобразуется к виду &amp;lt;code&amp;gt;{{s|7 6 −}}&amp;lt;/code&amp;gt; (результат умножения — 6, — заменяет тройку «2 3 *»).&lt;br /&gt;
# Второй знак операции — «−». Выполняется операция вычитания над операндами 7 и 6.&lt;br /&gt;
# Вычисление закончено. Результат последней операции равен 1, это и есть результат вычисления выражения.&lt;br /&gt;
&lt;br /&gt;
Очевидное расширение обратной польской записи на унарные, тернарные и операции с любым другим количеством операндов: при использовании знаков таких операций в вычислении выражения операция применяется к соответствующему числу последних встретившихся операндов.&lt;br /&gt;
&lt;br /&gt;
Особенности обратной польской записи следующие:&lt;br /&gt;
* Порядок выполнения операций однозначно задаётся порядком следования знаков операций в выражении, поэтому отпадает необходимость использования скобок и введения приоритетов и ассоциативности операций.&lt;br /&gt;
* В отличие от инфиксной записи, невозможно использовать одни и те же знаки для записи унарных и бинарных операций. Так, в инфиксной записи выражение &amp;lt;code&amp;gt;{{s|5 * (−3 + 8)}}&amp;lt;/code&amp;gt; использует знак «минус» как символ унарной операции (изменение знака числа), а выражение &amp;lt;code&amp;gt;{{s|(10 − 15) * 3}}&amp;lt;/code&amp;gt; применяет этот же знак для обозначения бинарной операции (вычитание). Конкретная операция определяется тем, в какой позиции находится знак. Обратная польская запись не позволяет этого: запись &amp;lt;code&amp;gt;{{s|5 3 − 8 + *}}&amp;lt;/code&amp;gt; (условный аналог первого выражения) будет интерпретирована как ошибочная, поскольку невозможно определить, что «минус» после 5 и 3 обозначает не вычитание; в результате будет сделана попытка вычислить сначала &amp;lt;code&amp;gt;5 − 3&amp;lt;/code&amp;gt;, затем &amp;lt;code&amp;gt;2 + 8&amp;lt;/code&amp;gt;, после чего выяснится, что для операции умножения не хватает операндов. Чтобы всё же записать это выражение, придётся либо переформулировать его (например, записав вместо выражения &amp;lt;code&amp;gt;{{s|− 3}}&amp;lt;/code&amp;gt; выражение &amp;lt;code&amp;gt;{{s|0 − 3}}&amp;lt;/code&amp;gt;), либо ввести для операции изменения знака отдельное обозначение, например, «±»: &amp;lt;code&amp;gt;{{s|5 3 ± 8 + *}}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Так же, как и в инфиксной нотации, в ОПН одно и то же вычисление может быть записано в нескольких разных вариантах. Например, выражение &amp;lt;code&amp;gt;{{s|(10 − 15) * 3}}&amp;lt;/code&amp;gt; в ОПН можно записать как &amp;lt;code&amp;gt;{{s|10 15 − 3 *}}&amp;lt;/code&amp;gt;, а можно — как &amp;lt;code&amp;gt;{{s|3 10 15 − *}}&amp;lt;/code&amp;gt;&lt;br /&gt;
* Из-за отсутствия скобок обратная польская запись короче инфиксной. За счёт этого при вычислениях на калькуляторах повышается скорость работы оператора (уменьшается количество нажимаемых клавиш), а в программируемых устройствах сокращается объём тех частей программы, которые описывают вычисления. Последнее может быть немаловажно для портативных и встроенных вычислительных устройств, имеющих жёсткие ограничения на объём памяти.&lt;br /&gt;
&lt;br /&gt;
== Вычисления на стеке ==&lt;br /&gt;
&lt;br /&gt;
=== Общий порядок ===&lt;br /&gt;
Автоматизация вычисления выражений в обратной польской нотации основана на использовании [[стек]]а. Алгоритм вычисления для стековой машины элементарен:&lt;br /&gt;
&lt;br /&gt;
# Обработка входного символа&lt;br /&gt;
#* Если на вход подан операнд, он помещается на вершину стека.&lt;br /&gt;
#* Если на вход подан знак операции, то соответствующая операция выполняется над требуемым количеством значений, извлечённых из стека, взятых в порядке добавления. Результат выполненной операции кладётся на вершину стека.&lt;br /&gt;
# Если входной набор символов обработан не полностью, перейти к шагу 1.&lt;br /&gt;
# После полной обработки входного набора символов результат вычисления выражения лежит на вершине стека.&lt;br /&gt;
&lt;br /&gt;
Реализация стековой машины, как программная, так и аппаратная, чрезвычайно проста и может быть очень эффективной. Обратная польская запись совершенно унифицирована — она принципиально одинаково записывает унарные, бинарные, тернарные и любые другие операции, а также обращения к функциям, что позволяет не усложнять конструкцию вычислительных устройств при расширении набора поддерживаемых операций. Это и послужило причиной использования обратной польской записи в некоторых научных и программируемых микрокалькуляторах.&lt;br /&gt;
&lt;br /&gt;
=== Пример вычисления выражений ===&lt;br /&gt;
Инфиксное выражение &amp;lt;math&amp;gt;(1 + 2) \times 4 + 3&amp;lt;/math&amp;gt; в ОПН может быть записано так: &amp;lt;code&amp;gt; 1 2 + 4 × 3 +&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисление производится слева направо, ввод интерпретируется как указано в приведённой ниже таблице (указано состояние стека после выполнения операции, вершина стека выделена &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;красным цветом&amp;lt;/span&amp;gt;):&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
!Ввод&lt;br /&gt;
!Операция&lt;br /&gt;
!Стек&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|поместить в стек&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|поместить в стек&lt;br /&gt;
|1, &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;+&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|сложение&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|поместить в стек&lt;br /&gt;
|3, &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|*&lt;br /&gt;
|умножение&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;12&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|поместить в стек&lt;br /&gt;
|12, &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;+&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|сложение&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;15&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Результат, 15, в конце вычислений находится на вершине стека.&lt;br /&gt;
&lt;br /&gt;
Клавиша «Ввод» (обозначаемая на калькуляторах как «Enter» или символом «↑») выполняет роль разделителя операндов, когда два операнда непосредственно следуют друг за другом. Если за операндом следует [[Знаки операций|знак операции]], то её нажатие не требуется, это сокращает количество действий, которые нужно выполнить для получения результата.&lt;br /&gt;
&lt;br /&gt;
== Преобразование из инфиксной нотации ==&lt;br /&gt;
[[Дейкстра, Эдсгер Вайб|Эдсгер Дейкстра]] изобрёл алгоритм для преобразования выражений из [[инфиксная нотация|инфиксной нотации]] в ОПЗ. Алгоритм получил название «сортировочная станция», за сходство его операций с происходящим на железнодорожных сортировочных станциях. Как и алгоритм вычисления ОПЗ, [[алгоритм сортировочной станции]] основан на стеке. В преобразовании участвуют две текстовых переменных: входная и выходная строки. В процессе преобразования используется стек, хранящий ещё не добавленные к выходной строке операции. Преобразующая программа читает входную строку последовательно символ за символом (символ — это не обязательно буква), выполняет на каждом шаге некоторые действия в зависимости от того, какой символ был прочитан.&lt;br /&gt;
&lt;br /&gt;
=== Простой пример ===&lt;br /&gt;
Вход: &amp;lt;code&amp;gt;3 + 4&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Добавим &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; к выходной строке (если прочитано число, то оно сразу добавляется к выходной строке).&lt;br /&gt;
&lt;br /&gt;
Помещаем &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; (или его Идентификатор) в стек операций.&lt;br /&gt;
&lt;br /&gt;
Добавим &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; к выходной строке.&lt;br /&gt;
&lt;br /&gt;
Мы прочитали всё выражение, теперь выталкиваем все оставшиеся в стеке операции в выходную строку. В нашем примере в стеке содержится только &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходная строка: &amp;lt;code&amp;gt;3 4 +&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном примере проявляются некоторые правила: все числа переносятся в выходную строку сразу после прочтения; когда выражение прочитано полностью, все оставшиеся в стеке операции выталкиваются в выходную строку.&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм ===&lt;br /&gt;
* Пока есть ещё символы для чтения:&lt;br /&gt;
::* Читаем очередной символ.&lt;br /&gt;
::* Если символ является числом или постфиксной функцией (например, ! — [[факториал]]), добавляем его к выходной строке.&lt;br /&gt;
::* Если символ является префиксной функцией (например, sin — [[синус]]), помещаем его в стек.&lt;br /&gt;
::* Если символ является открывающей скобкой, помещаем его в стек.&lt;br /&gt;
::* Если символ является закрывающей скобкой:&lt;br /&gt;
:::: До тех пор, пока верхним элементом стека не станет открывающая скобка, выталкиваем элементы из стека в выходную строку. При этом открывающая скобка удаляется из стека, но в выходную строку не добавляется. Если стек закончился раньше, чем мы встретили открывающую скобку, это означает, что в выражении либо неверно поставлен разделитель, либо не согласованы скобки.&lt;br /&gt;
::::* Если существуют разные виды скобок, появление непарной скобки также свидетельствует об ошибке. Если какие-то скобки одновременно являются функциями (например, [x] — [[целая часть]]), добавляем к выходной строке символ этой функции.&lt;br /&gt;
::* Если символ является бинарной операцией &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;о1&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;, тогда:&lt;br /&gt;
::: 1) пока на вершине стека префиксная функция…&lt;br /&gt;
::::: … ИЛИ операция на вершине стека приоритетнее или такого же уровня приоритета как &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;o1&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
::::: … ИЛИ операция на вершине стека [[Ассоциативность (программирование)|левоассоциативная]] с приоритетом как у &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;o1&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
:::: … выталкиваем верхний элемент стека в выходную строку;&lt;br /&gt;
::: 2) помещаем операцию &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;o1&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; в стек.&lt;br /&gt;
* Когда входная строка закончилась, выталкиваем все символы из стека в выходную строку. В стеке должны были остаться только символы операций; если это не так, значит в выражении не согласованы скобки.&lt;br /&gt;
&lt;br /&gt;
==== Ограничения и модификации ====&lt;br /&gt;
Алгоритм предполагает, что исходная строка корректна (проверяются не все ошибки), и все префиксные/постфиксные функции унарные.&lt;br /&gt;
&lt;br /&gt;
Модификацию для многоместных функций с фиксированным количеством аргументов см. [[Алгоритм сортировочной станции|в основной статье]].&lt;br /&gt;
&lt;br /&gt;
Для операций вроде −&amp;#039;&amp;#039;x&amp;#039;&amp;#039;, являющихся как бинарными, так и унарными, нужна модификация: при обнаружении подобной операции система смотрит на предыдущий символ и определяет, чем будет минус, бинарной операцией или унарной функцией. Соответственно, в стеке и ОПЗ нужны разные символы для бинарного и унарного минуса.&lt;br /&gt;
&lt;br /&gt;
=== Сложный пример ===&lt;br /&gt;
[[Приоритет операции|Приоритеты]]:&lt;br /&gt;
&lt;br /&gt;
* самый высокий: выражения, заключённые в скобки ( )&lt;br /&gt;
* высокий: ^&lt;br /&gt;
* средний: * /&lt;br /&gt;
* низкий: + −&lt;br /&gt;
 Вход: 3 + 4 * 2 / (1 - 5)^2&lt;br /&gt;
 &lt;br /&gt;
 Читаем «3»&lt;br /&gt;
  Добавим «3» к выходной строке&lt;br /&gt;
   Выход: 3&lt;br /&gt;
 &lt;br /&gt;
 Читаем «+»&lt;br /&gt;
  Кладём «+» в стек&lt;br /&gt;
   Выход: 3&lt;br /&gt;
   Стек: +&lt;br /&gt;
 &lt;br /&gt;
 Читаем «4»&lt;br /&gt;
  Добавим «4» к выходной строке&lt;br /&gt;
   Выход: 3 4&lt;br /&gt;
   Стек: +&lt;br /&gt;
 &lt;br /&gt;
 Читаем «*»&lt;br /&gt;
  Кладём «*» в стек&lt;br /&gt;
   Выход: 3 4&lt;br /&gt;
   Стек: + *&lt;br /&gt;
 &lt;br /&gt;
 Читаем «2»&lt;br /&gt;
  Добавим «2» к выходной строке&lt;br /&gt;
   Выход: 3 4 2&lt;br /&gt;
   Стек: + *&lt;br /&gt;
 &lt;br /&gt;
 Читаем «/»&lt;br /&gt;
  Выталкиваем «*» из стека в выходную строку, кладём «/» в стек&lt;br /&gt;
   Выход: 3 4 2 *&lt;br /&gt;
   Стек: + /&lt;br /&gt;
 &lt;br /&gt;
 Читаем «(»&lt;br /&gt;
  Кладём «(» в стек&lt;br /&gt;
   Выход: 3 4 2 *&lt;br /&gt;
   Стек: + / (&lt;br /&gt;
 &lt;br /&gt;
 Читаем «1»&lt;br /&gt;
  Добавим «1» к выходной строке&lt;br /&gt;
   Выход: 3 4 2 * 1&lt;br /&gt;
   Стек: + / (&lt;br /&gt;
 &lt;br /&gt;
 Читаем «−»&lt;br /&gt;
  Кладём «−» в стек&lt;br /&gt;
   Выход: 3 4 2 * 1&lt;br /&gt;
   Стек: + / ( −&lt;br /&gt;
 &lt;br /&gt;
 Читаем «5»&lt;br /&gt;
  Добавим «5» к выходной строке&lt;br /&gt;
   Выход: 3 4 2 * 1 5&lt;br /&gt;
   Стек: + / ( -&lt;br /&gt;
 &lt;br /&gt;
 Читаем «)»&lt;br /&gt;
  Выталкиваем «−» из стека в выходную строку, выталкиваем «(»&lt;br /&gt;
   Выход: 3 4 2 * 1 5 −&lt;br /&gt;
   Стек: + /&lt;br /&gt;
 &lt;br /&gt;
 Читаем «^»&lt;br /&gt;
  Кладём «^» в стек&lt;br /&gt;
   Выход: 3 4 2 * 1 5 −&lt;br /&gt;
   Стек: + / ^&lt;br /&gt;
 &lt;br /&gt;
 Читаем «2»&lt;br /&gt;
  Добавим «2» к выходной строке&lt;br /&gt;
   Выход: 3 4 2 * 1 5 − 2&lt;br /&gt;
   Стек: + / ^&lt;br /&gt;
 &lt;br /&gt;
 Конец выражения&lt;br /&gt;
  Выталкиваем все элементы из стека в строку&lt;br /&gt;
   Выход: 3 4 2 * 1 5 − 2 ^ / +&lt;br /&gt;
&lt;br /&gt;
== Оптимизация выражений ==&lt;br /&gt;
Если вы пишете интерпретатор, то выходная строка, полученная после преобразования исходного выражения в обратную польскую нотацию, может храниться вместо исходного выражения для последующей интерпретации. Обратная польская нотация также позволяет компьютеру упрощать выражения.&lt;br /&gt;
&lt;br /&gt;
=== Пример алгоритма упрощения выражения ===&lt;br /&gt;
Рассмотрим алгоритм, который осуществляет предвычисление констант в выражении. Дано выражение в ОПН. Нам понадобится стек для хранения смешанных данных (чисел и операторов).&lt;br /&gt;
&lt;br /&gt;
Алгоритм подобен тому, который применяется для вычисления выражений. Мы просматриваем выражение слева направо.&lt;br /&gt;
&lt;br /&gt;
Пока есть символы для чтения:&lt;br /&gt;
::* Читаем очередной символ.&lt;br /&gt;
::* Если символ является числом, помещаем его в стек.&lt;br /&gt;
::* Если символ является переменной, считая что переменная имеет значение &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;null&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;, помещаем символ в стек.&lt;br /&gt;
::* Если символ является оператором:&lt;br /&gt;
::* 1) (если все аргументы оператора, лежащие в стеке, имеют значение, отличное от &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;null&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;) выталкиваем аргументы оператора из стека и помещаем в стек результат операции;&lt;br /&gt;
::* 2) (если хотя бы один из аргументов имеет значение &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;null&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;) считая что результат операции &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;null&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;, кладём символ оператора в стек.&lt;br /&gt;
&lt;br /&gt;
После того, как всё выражение просмотрено, то, что осталось в стеке, является оптимизированым выражением (операторы выражения лежат в стеке в обратном порядке).&lt;br /&gt;
&lt;br /&gt;
=== Пример работы алгоритма ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
Выражение&lt;br /&gt;
Инфиксная нотация: exp(-1/2*x)&lt;br /&gt;
Обратная Польская нотация: -1 2 / x * exp&lt;br /&gt;
&lt;br /&gt;
Читаем: «-1»&lt;br /&gt;
 Кладём «-1» в стек&lt;br /&gt;
  Стек: -1&lt;br /&gt;
&lt;br /&gt;
Читаем: «2»&lt;br /&gt;
 Кладём «2» в стек&lt;br /&gt;
  Стек: -1 2&lt;br /&gt;
&lt;br /&gt;
Читаем: «/»&lt;br /&gt;
 Вычисляем частное, результат кладём в стек&lt;br /&gt;
  Стек: -0.5&lt;br /&gt;
&lt;br /&gt;
Читаем: «x»&lt;br /&gt;
 Кладём «x» в стек со значением null&lt;br /&gt;
  Стек: -0.5 x(null)&lt;br /&gt;
&lt;br /&gt;
Читаем: «*»&lt;br /&gt;
 Кладём «*» в стек со значением null&lt;br /&gt;
  Стек: -0.5 x(null) *(null)&lt;br /&gt;
&lt;br /&gt;
Читаем «exp»&lt;br /&gt;
 Кладём «exp» в стек со значением null&lt;br /&gt;
  Стек: -0.5 x(null) *(null) exp(null)&lt;br /&gt;
&lt;br /&gt;
Результат оптимизации: -0.5 x * exp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Данный метод, очевидно, не включает всех возможных способов оптимизации.&lt;br /&gt;
&lt;br /&gt;
== Примеры реализации ==&lt;br /&gt;
В статье «[[v:Обратная польская запись: примеры реализации|Обратная польская запись: примеры реализации]]» собраны примеры реализации обратной польской записи на различных языках программирования.&lt;br /&gt;
&lt;br /&gt;
== Практические реализации ==&lt;br /&gt;
В качестве практического применения данной методики можно привести организацию [[байт-код]]а конфигураций прикладных решений системы [[1С:Предприятие]]. Официального подтверждения компания [[1С]] не даёт, но пользователи данной системы на специализированных форумах приводят доказательства и алгоритмы, позволяющие [[Декомпиляция|декомпилировать]] исходные тексты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* {{книга|автор=Т. Пратт, М. Зелковиц|заглавие=Языки программирования: разработка и реализация|оригинал=Terrence W. Pratt, Marvin V. Zelkowitz. Programming Languages: Design and Implementation|издание=4-е издание|издательство=Питер|год=2002|серия=Классика Computer Science|страниц=688|isbn=5-318-00189-0|тираж=4000|ref=Пратт, Зелковиц}}&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания}}&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
Языки программирования, использующие ОПН в качестве основной:&lt;br /&gt;
* [[Forth (язык программирования)|Forth]]&lt;br /&gt;
* [[Factor (язык программирования)|Factor]]&lt;br /&gt;
* [[Postscript]]&lt;br /&gt;
* Язык стилей оформления [[BibTeX]]&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://algolist.manual.ru/maths/misc/revpn.php Обратная польская нотация]&lt;br /&gt;
* http://www.univer.omsk.ru/students/m84/docs/pol_zap.html&lt;br /&gt;
* [http://martiros24.blogspot.ru/2016/06/blog-post.html Реализация польской инверсной записи (ПОЛИЗа) на PHP]&lt;br /&gt;
&lt;br /&gt;
{{rq|&lt;br /&gt;
{{нет источников|дата=2024-05-10}}&lt;br /&gt;
{{нет сносок|дата=2024-05-10}}&lt;br /&gt;
}}&lt;br /&gt;
{{Внешние ссылки}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Калькуляторы]]&lt;br /&gt;
[[Категория:Математические обозначения]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Master-lame-master</name></author>
	</entry>
</feed>