Вычисление арифметического выражения
Условие
В этом задании Вам предстоит написать функцию
double evaluate(const std::string& line);
в файле calculator.h, вычисляющую значение арифметического выражения с помощью алгоритма Дейкстры. Функция принимает строку, содержащую выражение. Выражение может включать четыре арифметические оператора +, -, * и /, а также оператор извлечения квадратного корня sqrt с полным набором скобок.
Гарантируется, что
- выражение корректно
- выражения снабжены полным набором скобок
- скобки, операторы, числа отделены пробелом
Примеры корректный выражений:
( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) )
( 1 + ( 5 * ( 4 * 5 ) ) )
( 1 + ( 5 * 20 ) )
( 1 + 100 )
101
( 1 + ( sqrt ( 100 ) * 10 ) )
Алгоритм решения
Создаем два стека: один для операндов (чисел), а второй для операторов. Читаем строку слева направо и рассматриваем текущую часть строки:
- Добавляем операнд в стек операндов
- Добавляем оператор в стек операторов
- Игнорируем открывающую скобку
- Встретив закрывающую скобку, снимаем со стеков оператор и соответстующее количество операндов, и помещаем в стек результат применения оператора к операндам
После прочтения строки в стеке операндов остается результат вычисления, который необходимо вернуть из функции.
Как тестировать локально
Собрать программу с помощью cmake и запустить ctest:
cmake -S . -B build/ -G "MinGW Makefiles"
cmake --build build/
ctest --test-dir build -V