提问者:小点点

(C++)用于计算返回不正确值的简单算术表达式的解析树


我尝试编写一个函数,它接受一个简单的算术方程,将其转换为解析树,并返回计算值。 由于某种原因,返回的值根本不正确。 (不是说它有帮助,而是用Python编码的相同函数可以正常工作)。 我已经重新检查了多次,但我无法找到问题所在。 我已经测试了BinaryTree类和build_parse_tree()函数,它们似乎可以正常工作。 我很确定这是eval_parse_tree()函数的问题。 请让我知道这个实现的问题是什么。

是的,我知道这个实现只适用于个位数,但这在这里应该不是问题。

#include <iostream>
#include <vector>
using namespace std;

class BinaryTree{
private:
    char root;
    BinaryTree * left = NULL;
    BinaryTree * right = NULL;
public:
    BinaryTree(char root_val){
        // constructor
        root = root_val;
    }
    void insert_right(char value){
        BinaryTree * new_node = new BinaryTree(value);
        if(right == NULL)
            right = new_node;
        else{
            new_node -> right = right;
            right = new_node;
        }
    }
    void insert_left(char value){
        BinaryTree * new_node = new BinaryTree(value);
        if(left == NULL)
            left = new_node;
        else{
            new_node -> left = left;
            left = new_node;
        }
    }
    BinaryTree * get_right(){
        return right;
    }
    BinaryTree * get_left(){
        return left;
    }
    char get_root(){
        return root;
    }
    void set_root(char value){
        root = value;
    }
};

bool is_operator(char token){
    string ops = "+-/*";
    for(unsigned long long int i = 0; i < ops.length(); i++)
        if(ops[i] == token)
            return true;
    return false;
}

BinaryTree * build_parse_tree(string expr){
    vector <BinaryTree *> stack;
    BinaryTree * tree = new BinaryTree(' ');
    stack.push_back(tree);
    for(long long unsigned int i = 0; i < expr.length(); i++){
        if(expr[i] == '('){
            tree -> insert_left(' ');
            stack.push_back(tree);
            tree = tree -> get_left();
        }
        else if(isdigit(expr[i])){
            tree -> set_root(expr[i]);
            tree = stack.back();
            stack.pop_back();
        }
        else if(is_operator(expr[i])){
            tree -> set_root(expr[i]);
            tree -> insert_right(' ');
            stack.push_back(tree);
            tree = tree -> get_right();
        }
        else{
            tree = stack.back();
            stack.pop_back();
        }
    }
    return tree;
}

int eval_parse_tree(BinaryTree * tree){
    //cout << "Root: " << tree -> get_root() << endl;
    char op;
    int left, right;
    BinaryTree * left_child = tree -> get_left();
    BinaryTree * right_child = tree -> get_right();
    if(left_child && right_child){
        op = tree -> get_root();
        left = eval_parse_tree(left_child);
        right = eval_parse_tree(right_child);
        switch(op){
            case '+': return (int)left + (int)right;
            case '-': return (int)left - (int)right;
            case '*': return (int)left * (int)right;
            case '/': return (int)left / (int)right;
        }
    }
    else
        return tree -> get_root();
}

int main(void){
    cout << eval_parse_tree(build_parse_tree("(5+(2*7))")) << endl; //returns 2803, instead of 19
}


共1个答案

匿名用户

问题是你在用字符进行计算,而不是用整数。 正如您可能知道的,每个字符都有一个ASCII码,这是该字符的数字表示,用于计算。 '5''2''7'的Ascii代码是53,50和55。

因此'5'+'2'*'7'实际上是2083,因为它实际上是53+50*55

一个简单的解决办法就是

return tree -> get_root();

eval_parse_tree

return tree -> get_root() - '0';

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|用于|计算|返回|不正确|值|简单|算术|表达式|解析|树)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?