Анализ чисел: руководство по вычислению математических выражений с помощью стеков

Математические выражения лежат в основе многих компьютерных программ и алгоритмов. Независимо от того, создаете ли вы приложение-калькулятор или реализуете сложный алгоритм, умение вычислять математические выражения является важнейшим навыком. В этой статье блога мы рассмотрим различные методы вычисления математических выражений с использованием стеков — фундаментальной структуры данных в информатике. Итак, хватайте свой любимый напиток и давайте окунемся в мир вычисления выражений на основе стека!

Метод 1: оценка постфиксных выражений.
Один популярный подход к оценке математических выражений заключается в преобразовании их в постфиксную нотацию (также известную как обратная польская нотация) и последующем использовании стека для выполнения оценки. Давайте рассмотрим пример, чтобы проиллюстрировать этот метод:

Выражение: 3 + 4 * 2 – 1

Шаг 1. Преобразуйте выражение в постфиксную запись:
3 4 2 * + 1 –

Шаг 2. Оцените постфиксное выражение с помощью стека:

  • Помещайте каждое число или оператор в стек.
  • При встрече с оператором извлеките два верхних числа из стека, выполните операцию и поместите результат обратно в стек.
  • Повторяйте, пока выражение не будет полностью вычислено.

Пример кода (Python):

def evaluate_postfix(expression):
    stack = []
    operators = {'+': lambda a, b: a + b, '-': lambda a, b: a - b, '*': lambda a, b: a * b, '/': lambda a, b: a / b}
    for token in expression:
        if token.isdigit():
            stack.append(int(token))
        else:
            operand2 = stack.pop()
            operand1 = stack.pop()
            result = operators[token](operand1, operand2)
            stack.append(result)
    return stack.pop()
expression = "3 4 2 * + 1 -"
result = evaluate_postfix(expression)
print(result)  # Output: 9

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

Пример кода (Python):

def infix_to_postfix(expression):
    precedence = {'+': 1, '-': 1, '*': 2, '/': 2}
    stack = []
    postfix = []
    for token in expression:
        if token.isdigit():
            postfix.append(token)
        elif token == '(':
            stack.append(token)
        elif token == ')':
            while stack and stack[-1] != '(':
                postfix.append(stack.pop())
            stack.pop()  # Discard the '('
        else:
            while stack and stack[-1] != '(' and precedence[token] <= precedence.get(stack[-1], 0):
                postfix.append(stack.pop())
            stack.append(token)
    while stack:
        postfix.append(stack.pop())
    return " ".join(postfix)
def evaluate_infix(expression):
    postfix_expression = infix_to_postfix(expression)
    result = evaluate_postfix(postfix_expression)
    return result
expression = "3 + 4 * 2 - 1"
result = evaluate_infix(expression)
print(result)  # Output: 9

Метод 3. Оценка с использованием деревьев выражений.
Другой подход к оценке математических выражений заключается в создании дерева выражений. Дерево выражений представляет структуру выражения в иерархическом порядке. Затем мы можем обойти дерево и выполнить оценку.

Пример кода (Python):

class Node:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None
def build_expression_tree(expression):
    stack = []
    for token in expression:
        if token.isdigit():
            node = Node(token)
            stack.append(node)
        else:
            node = Node(token)
            node.right = stack.pop()
            node.left = stack.pop()
            stack.append(node)
    return stack.pop()
def evaluate_expression_tree(root):
    if root.value.isdigit():
        return int(root.value)
    else:
        left_result = evaluate_expression_tree(root.left)
        right_result = evaluate_expression_tree(root.right)
        return evaluate_operation(left_result, right_result, root.value)
def evaluate_operation(a, b, operator):
    if operator == '+':
        return a + b
    elif operator == '-':
        return a - b
    elif operator == '*':
        return a * b
    elif operator == '/':
        return a / b
expression = ["3", "+", "4", "*", "2", "-", "1"]
root = build_expression_tree(expression)
result = evaluate_expression_tree(root)
print(result)  # Output: 9

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

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