преобразование из инфикса в префикс - PullRequest
15 голосов
/ 22 декабря 2009

Я готовлюсь к экзамену, на котором я не смог понять преобразование инфиксной записи в польскую для следующего выражения:

(a–b)/c*(d + e – f / g)

Может ли кто-нибудь шаг за шагом рассказать, как данное выражение будет преобразовано в префикс?

Ответы [ 14 ]

0 голосов
/ 15 июня 2015

Этот алгоритм поможет вам лучше понять.

Шаг 1. Нажмите «)» на СТЕК и добавьте «(« в конец A.

Шаг 2. Сканируйте A справа налево и повторяйте шаги с 3 по 6 для каждого элемента A, пока СТЕК не опустеет.

Шаг 3. Если обнаружен операнд, добавьте его в B.

Шаг 4. Если встречается правая скобка, нажмите на STACK.

Шаг 5. Если встречается оператор, то: а. Неоднократно извлекайте из STACK и добавляйте к B каждый оператор (в верхней части STACK), который имеет тот же или более высокий приоритет, чем оператор. б. Добавить оператора в STACK.

Шаг 6. Если вводится левая скобка, то а. Неоднократно извлекайте из STACK и добавляйте в B (каждый оператор в верхней части стека, пока не встретится левая скобка) б. Снять левую скобку.

Шаг 7. Выход

0 голосов
/ 20 июля 2014

Это алгоритм, использующий стек.
Просто следуйте этим простым шагам.

1. Обратно заданному инфиксному выражению.

2.Заменить '(' with ')' и ')' на '(' в обратном выражении.

3. Теперь примените стандартный инфикс к подпрограмме postfix.

4. Обратитесь к основному выражению постфикса, это даст требуемое выражение префикса.

В случае, если вы находите шаг 3 сложным, проконсультируйтесь http://scanftree.com/Data_Structure/infix-to-prefix где также приведен разработанный пример.

0 голосов
/ 22 декабря 2009

Простой поиск Google придумал это . Сомневаюсь, что любой может объяснить это проще. Но я думаю, что после редактирования я могу попытаться выдвинуть концепции, чтобы вы могли ответить на свой вопрос.

Подсказка:

Учись на экзамен, усердно, надо. Предсказываю тебе, оценка повышается, я делаю: D

Объяснение:

Все дело в том, как операции связаны с операндами. У каждого типа записи есть свои правила. Вам просто нужно сломать и запомнить эти правила. Если я сказал вам, что написал (2 * 2) / 3 как [* /] (2,2,3), все, что вам нужно сделать, это научиться превращать последнюю запись в предыдущую запись.

Моя пользовательская запись говорит, что возьмите первые два операнда и умножьте их, затем полученный операнд должен быть разделен на третий. Возьми ? Они пытаются научить вас трем вещам.

  1. Чтобы освоиться с различными обозначениями. Я привел пример, который вы найдете на языках ассемблера. операнды (которые вы используете) и операции (что вы хотите сделать с операндами).
  2. Правила старшинства в вычислительной технике не обязательно должны следовать тем, которые встречаются в математике.
  3. Оценка: как компьютер воспринимает программы и как он может их упорядочивать во время выполнения.
0 голосов
/ 22 декабря 2009

Может быть, вы говорите о обратной польской записи ? Если да, вы можете найти в википедии очень подробный пошаговый пример для преобразования; если нет, я понятия не имею, о чем вы спрашиваете: (

Возможно, вы также захотите прочитать мой ответ на другой вопрос, в котором я предоставил такую ​​реализацию: Класс оценки C ++ простых операций (+, -, /, *)

...