Я случайно позволил моим ученикам перегружать общий класс, используемый для решения следующей проблемы. Я понял, что это может быть проблемой для пользователей этого сайта.
Первая команда / функция, getNodes, принимает строку, представляющую выражение префикса с использованием целых чисел со знаком и четырех операций +, -, * и /, и создает соответствующий нулевой завершенный связанный список токенов, используя класс Node, с токены, связанные через «правый» указатель.
Вторая команда / функция, getTree, берет похожую строку, передает ее в getNodes и связывает результирующие узлы с деревом выражений.
Третья команда / функция оценивает, берет похожую строку, передает ее в getTree и оценивает результирующее дерево выражений для формирования ответа.
Далее следует чрезмерно ограниченный файл exptree.h. Проблема должна быть решена путем написания только трех функций, определенных выше, без дополнительных функций.
#ifndef EXPTREE_H_
#define EXPTREE_H_
using namespace std;
enum Ops{ADD, SUB, MUL, DIV, NUM};
class Node {
private:
int num;
Ops op;
Node *left, *right;
public:
friend Node *getNodes(string d);
friend Node *getTree(string d);
friend int evaluate (string);
};
int evaluate(string d);
Node *getNodes(string d);
Node *getTree(string d);
#endif
Единственные библиотеки, которые можно использовать, это
#include <iostream>
#include <vector>
#include <string>
#include "exptree.h"
Для тех из вас, кто беспокоится о моих учениках, сегодня я укажу, как всего пара более удачно расположенных функций позволила бы легко решить эту проблему. Я знаю, что дерево выражений может кодировать рациональные числа, а не только целые числа. Я также укажу на это сегодня.
Вот программа драйвера, которую я дал им на основе их спецификаций.
#include <iostream>
#include <string>
#include "exptree.h"
using namespace std;
void test(string s, int target) {
int result = evaluate(s);
if (result == target)
cout << s << " correctly evaluates to " << target << endl;
else
cout << s << "(" << result
<< ") incorrectly evaluates to " << target << endl;
}
int main() {
test("42", 42);
test("* - / 4 2 1 42", 42);
test("* - / -4 +2 -1 2", -2);
test("* - / -4 +2 -1 2 ", -2);
test("* 9 6", 54);
return 0;
}
Можете ли вы написать три функции как можно более элегантно, чтобы решить эту кошмарную проблему?