Задача на деревья выражений 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