В информатике и математике инфиксные выражения обычно используются для представления арифметических и логических операций, где операторы помещаются между операндами. С другой стороны, постфиксные выражения (также известные как обратная польская нотация) располагают операторы после их операндов. Преобразование инфиксных выражений в постфиксные может быть полезно для оценки выражений и упрощения их выполнения. В этой статье блога мы рассмотрим несколько методов преобразования инфиксных выражений в постфиксные, а также приведем примеры кода на популярном языке программирования.
Метод 1: алгоритм на основе стека
Этот метод использует структуру данных стека для преобразования инфиксного выражения в постфиксное. Алгоритм перебирает инфиксное выражение и выполняет следующие шаги:
- Инициализируйте пустой стек и пустую строку для хранения постфиксного выражения.
- Сканируйте инфиксное выражение слева направо.
- Если текущий элемент является операндом (числом или переменной), добавьте его в постфиксную строку.
- Если текущий элемент представляет собой открывающую скобку «(», поместите ее в стек.
- Если текущий элемент представляет собой закрывающую скобку «)», извлеките операторы из стека и добавьте их в постфиксную строку до тех пор, пока не встретите открывающуюся скобку. Отбросьте открывающую скобку.
- Если текущий элемент является оператором (+, -, *, / и т. д.), несколько раз извлеките операторы из стека и добавьте их в постфиксную строку, если они имеют более высокий приоритет, чем текущий оператор. Поместите текущий оператор в стек.
- После сканирования всего инфиксного выражения извлеките из стека все оставшиеся операторы и добавьте их в постфиксную строку.
- Получено результирующее постфиксное выражение.
Вот пример реализации на 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: алгоритм сортировочной станции
Алгоритм сортировочной станции — еще один популярный метод преобразования инфиксных выражений в постфиксные. Он использует два стека: один для операторов, а другой для выходных операндов. Алгоритм состоит из следующих шагов:
- Инициализировать пустой стек операторов и пустой стек вывода.
- Просканируйте инфиксное выражение слева направо.
- Если текущий элемент является операндом, поместите его в выходной стек.
- Если текущий элемент является оператором, несколько раз извлекайте операторы из стека операторов и помещайте их в стек вывода, если они имеют более высокий приоритет, чем текущий оператор. Затем поместите текущий оператор в стек операторов.
- Если текущий элемент является открывающей скобкой, поместите его в стек операторов.
- Если текущий элемент является закрывающей скобкой, несколько раз извлекайте операторы из стека операторов и помещайте их в выходной стек, пока не встретите открывающуюся скобку. Отбросьте открывающую скобку.
- После сканирования всего инфиксного выражения извлеките все оставшиеся операторы из стека операторов и поместите их в выходной стек.
- Результирующее постфиксное выражение получается из выходного стека.
Вот пример реализации алгоритма сортировочной станции на 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 поддерживает два стека для операторов и выходных операндов.
Используя эти методы, вы можете легко преобразовать инфиксные выражения в постфиксные, что позволяет упростить вычисление выражений и повысить эффективность выполнения в различных приложениях.
Не забудьте выбрать метод, который лучше всего соответствует вашему языку программирования и требованиям. Понимание этих методов преобразования — важный шаг в освоении манипуляций с выражениями и их оценки.