Перейти к содержанию

Последнее обновление:2026-10-12

Проектирование стекового калькулятора на C++

Напишем стековый калькулятор со следующим дизайном:

  • Поддержка операций +, -, *, /
  • Поддержка ввода в постфиксной записи

Например:

2 3 +
```Вывод:
5 ```Как это реализовать?

Два самых ключевых вопроса:

1.Как выполнять лексический разбор (токенизацию)

2.Как реализовать стек

1. Как токенизировать

Сначала условимся, что вход — это строка, разделённая пробелами; тогда мы можем разбить её на отдельные token с помощью istringstream; базовый каркас:

std::istringstream iss(expression);
std::string token;
while (iss >> token) {
}

2.Как реализовать стек

Для калькулятора самое главное — помещать в стек и извлекать из него.

  • встретили число — кладём в стек
  • встретили оператор — извлекаем из стека и вычисляем

Так мы можем написать каркас:

if (isNumber(token)) {
  pushNumber(token);
} else if (isOperator(token)) {
  popAndCal(token);
} else {
  throw std::runtime_error("Invalid token in expression.");
}
popAndCal — ядро вычислений, например:

void popAndCal(const std::string& token) {
  if (operandStack.size() < 2) {
    throw std::runtime_error("Invalid expression.");
  } else {
    double operand2 = operandStack.top();
    operandStack.pop();
    double operand1 = operandStack.top();
    operandStack.pop();
    double result = performOperation(operand1, operand2, token);
    operandStack.push(result);
  }
}
Таким образом, в стеке мы сохранили нужный нам результат — в конце достаточно вернуть top.

Разве не просто? Буду рад обсудить это вместе с вами.

Похожие темы

Комментарии