
- •14 Лекция
- •§ 4.3. Алгебра логики
- •Стандартный метод установления эквивалентности двух формул:
- •Логическая функция трех переменных задана формулой в префиксной форме:
- •Википедия Арифметика
- •История
- •Определение
- •Описание
- •Вычисления на стеке Общий порядок
- •Обратная польская запись
- •[Править] История
- •[Править] Определение
- •[Править] Описание
- •[Править] Вычисления на стеке [править] Общий порядок
- •[Править] Пример вычисления выражений
- •[Править] Преобразование из инфиксной нотации
- •[Править] Простой пример
- •[Править] Алгоритм
- •[Править] Сложный пример
- •[Править] Оптимизация выражений
- •[Править] Пример алгоритма упрощения выражения
- •[Править] Пример работы алгоритма
- •[Править] Программный стек [править] Организация в памяти
- •[Править] Операции со стеком
- •[Править] Аппаратный стек (Hardware stack)
- •[Править] Область применения [править] Аппаратный стек
- •[Править] Программный стек
- •[Править] Примечания
- •Стековый язык
- •[Править] См. Также
[Править] Оптимизация выражений
Если вы пишете интерпретатор, то выходная строка, полученная после преобразования исходного выражения в обратную польскую нотацию, может храниться вместо исходного выражения для последующей интерпретации. Обратная польская нотация также позволяет компьютеру упрощать выражения.
[Править] Пример алгоритма упрощения выражения
Рассмотрим алгоритм, который осуществляет предвычисление констант в выражении. Дано выражение в ОПН. Нам понадобится стек для хранения смешанных данных (чисел и операторов).
Алгоритм подобен тому, который применяется для вычисления выражений. Мы просматриваем выражение слева направо.
Пока есть символы для чтения:
Читаем очередной символ.
Если символ является числом, помещаем его в стек.
Если символ является переменной, считая что переменная имеет значение null, помещаем символ в стек.
Если символ является оператором:
1) (если все аргументы оператора, лежащие в стеке, имеют значение, отличное от null) выталкиваем аргументы оператора из стека и помещаем в стек результат операции;
2) (если хотя бы один из аргументов имеет значение null) считая что результат операции null, кладём символ оператора в стек.
После того, как всё выражение просмотрено, то, что осталось в стеке, является оптимизированым выражением (операторы выражения лежат в стеке в обратном порядке).
[Править] Пример работы алгоритма
Выражение
Инфиксая нотация: exp(-1/2*x)
Обратная Польская нотация: -1 2 / x * exp
Читаем: «-1»
Кладём «-1» в стек
Стек: -1
Читаем: «2»
Кладём «2» в стек
Стек: -1 2
Читаем: «/»
Вычисляем частное, результат кладём в стек
Стек: -0.5
Читаем: «x»
Кладём «x» в стек со значением null
Стек: -0.5 x(null)
Читаем: «*»
Кладём «*» в стек со значением null
Стек: -0.5 x(null) *(null)
Читаем «exp»
Кладём «exp» в стек со значением null
Стек: -0.5 x(null) *(null) exp(null)
Результат оптимизации: -0.5 x * exp
Данный метод, очевидно, не включает всех возможных способов оптимизации.
[править] Примеры реализации
В статье «Обратная польская запись: примеры реализации» собраны примеры реализации обратной польской записи на различных языках программирования.
[править] Практические реализации
В качестве практического применения данной методики можно привести организацию байт-кода конфигураций прикладных решений системы 1С:Предприятие. Официального подтверждения компания 1С не дает, но использующие данную систему программисты на специализированных форумах приводят доказательства и алгоритмы, позволяющие декомпилировать исходные тексты.
[править] Литература
Т. Пратт, М. Зелковиц Языки программирования: разработка и реализация = Terrence W. Pratt, Marvin V. Zelkowitz. Programming Languages: Design and Implementation. — 4-е издание. — Питер, 2002. — 688 с. — (Классика Computer Science). — 4000 экз. — ISBN 5-318-00189-0
[править] Примечания
↑ А. В. Ахо, Р. Сети, Д. Д. Ульман. Компиляторы: принципы, технологии и инструменты. М.: «Вильямс», 2003. С. 51.
[править] Ссылки
Языки программирования, использующие ОПН в качестве основной:
Forth
Factor
Postscript
Язык стилей оформления BibTeX
Другие ссылки:
Обратная польская нотация
http://www.univer.omsk.ru/students/m84/docs/pol_zap.html
Мини-лекция, посвящённая ОПН (на англ., с анимацией) — Автор: Bob Brown
Реализация Польской Инверсной Записи (ПОЛИЗа) на PHP
Преобразование выражения из инфиксной нотации в ПОЛИЗ с помощью алгоритма Дейкстры на C#
Источник — «http://ru.wikipedia.org/w/index.php?title=Обратная_польская_запись&oldid=52219380»
Категории:
Калькулятор
Математические обозначения
Стек
[править]
Материал из Википедии — свободной энциклопедии
Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 5 декабря 2012; проверки требуют 26 правок.
Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 5 декабря 2012; проверки требуют 26 правок.
Перейти к: навигация, поиск
У этого термина существуют и другие значения, см. Стек (значения).
Иллюстрация организации стека
Стек (англ. stack — стопка) — структура данных, представляющая из себя список элементов организованных по принципу LIFO (англ. last in — first out, «последним пришёл — первым вышел»).
Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно снять верхнюю.
В цифровом вычислительном комплексе стек называется магазином — по аналогии с магазином в огнестрельном оружии (стрельба начнётся с патрона, заряженного последним)
В 1946 М. Тьюринг ввел понятие стека[1]. А в 1957 году немцы Клаус Самельсон и Фридрих Л. Бауэр запатентовали идею[2].
В некоторых языках(например, Lisp, Python[3]) стеком можно назвать любой список, т.к. для них доступны операции pop и push. В языке C++ стандартная библиотека имеет класс с реализованной структурой и методами[4]. И т.д.
Содержание [убрать]
|