Вычисление арифметического выражения (5)
Вычисление арифметического выражения
Условие
В этом задании Вам предстоит написать функцию
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
:
mkdir build; cd build
cmake ..; cmake --build .
ctest -V