J'ai écrit du code pour convertir une arborescence d'expression en précommande et en post-commande, mais j'ai du mal à construire l'arbre d'expression à partir d'une expression infixe. J'ai un fichier .cc qui appellera la fonction build_expression_tree, appellera les fonctions de conversion et imprimera les expressions converties.Lire l'expression infixe dans une pile
Ceci est ma fonction actuelle de non-travail:
void Expression_Tree::build_expression_tree(char input[], int size)
{
for (int i = 0; i < size; i++)
{
if (input[i] == ' ')
{
i++;
}
if(input[i] >= '0' && input[i] <= 9)
{
ETNode *temp = new ETNode;
temp->left = temp->right = NULL;
temp->input = input[i];
tree_stack.push(temp);
}
else if (input[i] == '(')
{
ETNode *temp = new ETNode;
temp->left = temp->right = NULL;
temp->input = input[i];
tree_stack.push(temp);
}
else if (input[i] == ')')
{
while (tree_stack.top() != '(')
{
temp->right = tree_stack.top();
tree_stack.pop();
temp->left = tree_stack.top();
tree_stack.pop();
tree_stack.pop();
tree_stack.push(temp);
}
}
else if (input[i] == '+' || input[i] == '-' || input[i] == '*' || input[i] == '/')
{
while (!tree_stack.empty())
{
ETNode *temp = new ETNode;
temp->left = temp->right = NULL;
temp->input = input[i];
tree_stack.push(temp);
temp->right = tree_stack.top();
tree_stack.pop();
temp->left = tree_stack.top();
tree_stack.pop();
tree_stack.push(temp);
}
}
}
}
Les erreurs que je reçois à ce stade sont les suivants: Expression_Tree.h: 61: 40: Erreur: ISO C++ interdit comparaison entre pointeur et entier
while(tree_stack.top() != '(')
Expression_Tree.h: 62: 13: erreur: 'temp' n'a pas été déclarée dans ce champ
temp->right = tree_stack.top();
Expression_Tree.h: 62: 13: Erreur: « temp » n'a pas été déclarée dans ce champ
temp->left = tree_stack.top();
Je sais pourquoi les deux dernières erreurs (non déclarées dans la portée) se produisent, mais je ne tout simplement pas Je sais quoi faire pour résoudre le problème tout en faisant fonctionner correctement mon code.
Je ne sais même pas si mon code est complètement faux, mais tous les conseils seraient incroyablement appréciés! Merci.
EDIT: Ce sont les classes qui affectent la fonction Build_Expression_Tree.
class ETNode {
public:
char input;
ETNode *left, *right;
};
class Expression_Tree {
public:
Expression_Tree() { root = 0; };
~Expression_Tree() { clear(root); }
void build_expression_tree(char[], int);
void inorder() { inorder(root); }
void preorder() { preorder(root); }
void postorder() {postorder(root); }
private:
ETNode* root;
std::stack<ETNode*> tree_stack;
void visit(ETNode* p) { std::cout << p->input << " "; }
void inorder(ETNode*);
void preorder(ETNode*);
void postorder(ETNode*);
void clear(ETNode*);
};
s'il vous plaît nous montrer ce que '' tree_stack' et ETNode' sont – vu1p3n0x
@ vu1p3n0x J'ai modifié le message – user6276841
pourriez-vous préciser, vous n'utilisez la pile comme aide au bâtiment? et seulement en utilisant 'root' pour toutes les autres opérations? ou avez-vous besoin de la pile à préserver d'une manière ou d'une autre? – vu1p3n0x