Последнее обновление:2026-10-12
Проектирование стекового калькулятора на C++¶
Напишем стековый калькулятор со следующим дизайном:
- Поддержка операций
+,-,*,/ - Поддержка ввода в постфиксной записи
Например:
5 ```Как это реализовать?Два самых ключевых вопроса:
1.Как выполнять лексический разбор (токенизацию)
2.Как реализовать стек
1. Как токенизировать¶
Сначала условимся, что вход — это строка, разделённая пробелами; тогда мы можем разбить её на отдельные token с помощью istringstream; базовый каркас:
2.Как реализовать стек¶
Для калькулятора самое главное — помещать в стек и извлекать из него.
- встретили число — кладём в стек
- встретили оператор — извлекаем из стека и вычисляем
Так мы можем написать каркас:
if (isNumber(token)) {
pushNumber(token);
} else if (isOperator(token)) {
popAndCal(token);
} else {
throw std::runtime_error("Invalid token in expression.");
}
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);
}
}
Разве не просто? Буду рад обсудить это вместе с вами.
Похожие темы¶
- Пишем C++ FnOnce вручную | C++那些事
- Небольшой проект на C++ gRPC | C++那些事
- Межпроцессное взаимодействие в C++ на практике | C++那些事
- Демо сервиса коротких ссылок на C++ | C++那些事
- C++17 и SQLite: подсчёт размера каталога | C++那些事
- Тестирование производительности Google Benchmark | C++那些事
- HTTP-сервер на корутинах C++20 | C++那些事
- Сериализация Protobuf ZeroCopy | C++那些事
- Ускорение Python с помощью pybind11 | C++那些事