C++ и Python

Вычисление арифметического выражения (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