Преобразование инфикса в постфикс: изучение нескольких методов на примерах кода

В информатике и математике инфиксные выражения обычно используются для представления арифметических и логических операций, где операторы помещаются между операндами. С другой стороны, постфиксные выражения (также известные как обратная польская нотация) располагают операторы после их операндов. Преобразование инфиксных выражений в постфиксные может быть полезно для оценки выражений и упрощения их выполнения. В этой статье блога мы рассмотрим несколько методов преобразования инфиксных выражений в постфиксные, а также приведем примеры кода на популярном языке программирования.

Метод 1: алгоритм на основе стека
Этот метод использует структуру данных стека для преобразования инфиксного выражения в постфиксное. Алгоритм перебирает инфиксное выражение и выполняет следующие шаги:

  1. Инициализируйте пустой стек и пустую строку для хранения постфиксного выражения.
  2. Сканируйте инфиксное выражение слева направо.
  3. Если текущий элемент является операндом (числом или переменной), добавьте его в постфиксную строку.
  4. Если текущий элемент представляет собой открывающую скобку «(», поместите ее в стек.
  5. Если текущий элемент представляет собой закрывающую скобку «)», извлеките операторы из стека и добавьте их в постфиксную строку до тех пор, пока не встретите открывающуюся скобку. Отбросьте открывающую скобку.
  6. Если текущий элемент является оператором (+, -, *, / и т. д.), несколько раз извлеките операторы из стека и добавьте их в постфиксную строку, если они имеют более высокий приоритет, чем текущий оператор. Поместите текущий оператор в стек.
  7. После сканирования всего инфиксного выражения извлеките из стека все оставшиеся операторы и добавьте их в постфиксную строку.
  8. Получено результирующее постфиксное выражение.

Вот пример реализации на Python:

def infix_to_postfix(expression):
    precedence = {'+': 1, '-': 1, '*': 2, '/': 2, '^': 3}
    stack = []
    postfix = ''

    for char in expression:
        if char.isalnum():
            postfix += char
        elif char == '(':
            stack.append(char)
        elif char == ')':
            while stack and stack[-1] != '(':
                postfix += stack.pop()
            stack.pop()  # Discard the opening parenthesis
        else:
            while stack and precedence[char] <= precedence.get(stack[-1], 0):
                postfix += stack.pop()
            stack.append(char)

    while stack:
        postfix += stack.pop()

    return postfix

Метод 2: алгоритм сортировочной станции
Алгоритм сортировочной станции — еще один популярный метод преобразования инфиксных выражений в постфиксные. Он использует два стека: один для операторов, а другой для выходных операндов. Алгоритм состоит из следующих шагов:

  1. Инициализировать пустой стек операторов и пустой стек вывода.
  2. Просканируйте инфиксное выражение слева направо.
  3. Если текущий элемент является операндом, поместите его в выходной стек.
  4. Если текущий элемент является оператором, несколько раз извлекайте операторы из стека операторов и помещайте их в стек вывода, если они имеют более высокий приоритет, чем текущий оператор. Затем поместите текущий оператор в стек операторов.
  5. Если текущий элемент является открывающей скобкой, поместите его в стек операторов.
  6. Если текущий элемент является закрывающей скобкой, несколько раз извлекайте операторы из стека операторов и помещайте их в выходной стек, пока не встретите открывающуюся скобку. Отбросьте открывающую скобку.
  7. После сканирования всего инфиксного выражения извлеките все оставшиеся операторы из стека операторов и поместите их в выходной стек.
  8. Результирующее постфиксное выражение получается из выходного стека.

Вот пример реализации алгоритма сортировочной станции на Python:

def infix_to_postfix(expression):
    precedence = {'+': 1, '-': 1, '*': 2, '/': 2, '^': 3}
    associativity = {'+': 'left', '-': 'left', '*': 'left', '/': 'left', '^': 'right'}
    operators = []
    postfix = []

    for char in expression:
        if char.isalnum():
            postfix.append(char)
        elif char == '(':
            operators.append(char)
        elif char == ')':
            while operators and operators[-1] != '(':
                postfix.append(operators.pop())
            operators.pop()  # Discard the opening parenthesis
        else:
            while operators and (
                    (associativity[char] == 'left' and precedence[char] <= precedence.get(operators[-1], 0)) or
                    (associativity[char] == 'right' and precedence[char] < precedence.get(operators[-1], 0))):
                postfix.append(operators.pop())
            operators.append(char)

    while operators:
        postfix.append(operators.pop())

    return ''.join(postfix)

В этой статье мы рассмотрели два популярных метода преобразования инфиксных выражений в постфиксные: алгоритм на основе стека и алгоритм сортировочной станции. Оба метода используют стеки для эффективного преобразования выражений. Алгоритм на основе стека напрямую сканирует инфиксное выражение и использует стек для обработки операторов и скобок, а алгоритм Shunting Yard поддерживает два стека для операторов и выходных операндов.

Используя эти методы, вы можете легко преобразовать инфиксные выражения в постфиксные, что позволяет упростить вычисление выражений и повысить эффективность выполнения в различных приложениях.

Не забудьте выбрать метод, который лучше всего соответствует вашему языку программирования и требованиям. Понимание этих методов преобразования — важный шаг в освоении манипуляций с выражениями и их оценки.