Задача на деревья выражений c++. back() called on empty deque

В текстовом файле с именем filename дано арифметическое выражение в префиксной форме. Операндами в выражении являются целые числа из промежутка от 0 до 9. Используемые операции: сложение(+), вычитание(-), умножение(*), деление нацело(/), целочисленный остаток от деления(%) и возведение в степень(^). Постройте дерево, соответствующее данному выражению. Знаки операций кодируйте числами: сложение(-1), вычитание(-2), умножение(-3), деление(-4), остаток от деления(-5), возведение в степень (-6). Преобразуйте дерево, вычислив значения всех поддеревьев, для которых результат вычислений является числом из промежутка от 0 до 9 (замените такие поддеревья их значениями). Выведите указатель на корень полученного дерева.

#include <fstream>
#include <stack>
using namespace std;


int min_to_oper(string str) {
    if (str == "+") return -1;
    if (str == "-") return -2;
    if (str == "*") return -3;
    if (str == "/") return -4;
    if (str == "%") return -5;
    if (str == "^") return -6;
    return stoi(str);
}

int calc_res(PNode tree) {
    if (!tree) return 0;
    calc_res(tree->Left);
    calc_res(tree->Right);
    switch (tree->Data) {
    case -1: {
        tree->Data = tree->Left->Data + tree->Right->Data;
        return tree->Left->Data + tree->Right->Data;
    }
    case -2: {
        tree->Data = tree->Left->Data - tree->Right->Data;
        return tree->Left->Data - tree->Right->Data;
    }
    case -3: {
        tree->Data = tree->Left->Data * tree->Right->Data;
        return tree->Left->Data * tree->Right->Data;
    }
    case -4: {
        tree->Data = tree->Left->Data / tree->Right->Data;
        return tree->Left->Data / tree->Right->Data;
    }
    case -5: {
        tree->Data = tree->Left->Data % tree->Right->Data;
        return tree->Left->Data % tree->Right->Data;
    }
    case -6: {
        tree->Data = (int)pow(tree->Left->Data, tree->Right->Data);
        return (int)pow(tree->Left->Data, tree->Right->Data);
    }
    }
}

void fix(PNode& tree) {
    if (!tree) return;
    if (tree->Data < 0 && tree->Left && tree->Right) {
        int res = calc_res(tree);
        if (res >= 0 && res <= 9) {
            tree->Data = res;
            tree->Left = NULL;
            tree->Right = NULL;
        }
        else {
            fix(tree->Left);
            fix(tree->Right);
        }
    }
}

void Solve()
{
    Task("CalcTree7");
    string filename;
    pt >> filename;

    ifstream file(filename);
    stack<PNode> st;
    vector<string> tokens{ istream_iterator<string>{file}, istream_iterator<string>{} };
    reverse(tokens.begin(), tokens.end());

    PNode node = NULL;
    string temp;

    while (!tokens.empty()) {
        temp = tokens.back();
        tokens.pop_back();

        int op = min_to_oper(temp);
        node = new Node;
        node->Data = op;
        node->Left = node->Right = NULL;

        if (op >= 0) {
            st.push(node);
        }
        else {
            node->Right = st.top(); st.pop();
            node->Left = st.top(); st.pop();
            st.push(node);
        }
    }

    PNode root = st.top();
    fix(root); 
    Show(root);
    pt << root;
}

Ошибка: back() called on empty deque


Ответы (0 шт):