C++ 构建二叉表达式树C++;

C++ 构建二叉表达式树C++;,c++,binary-tree,C++,Binary Tree,我做了一个算法,用一个简单的表达式建立一个二叉树。但我的每一个动作都需要括号。例如,我可以转换这个表达式:(2+(3*5))。在数学中,如果没有括号,一切都可以,但我的算法可以在没有括号的情况下工作。有没有一种方法可以生成一个二元表达式树来处理这个表达式:2+3*5? 以下是我的算法,每个操作都需要括号: void Tree::MakeTree(string expr, int &pos, Node *node) { if(expr[pos] == '(') {

我做了一个算法,用一个简单的表达式建立一个二叉树。但我的每一个动作都需要括号。例如,我可以转换这个表达式:
(2+(3*5))
。在数学中,如果没有括号,一切都可以,但我的算法可以在没有括号的情况下工作。有没有一种方法可以生成一个二元表达式树来处理这个表达式:
2+3*5
? 以下是我的算法,每个操作都需要括号:

void Tree::MakeTree(string expr, int &pos, Node *node)
{
    if(expr[pos] == '(')
    {
        pos++;
        node->Left = new Node;
        node->Left->Left = NULL;
        node->Left->Right = NULL;
        MakeTree(expr, pos, node->Left);
        MakeTree(expr, pos, node);
        return;
    }

    if(expr[pos] >= '0' && expr[pos] <= '9')
    {
        node->data = expr[pos];
        pos++;
        return;
    }

    if(expr[pos] == '+' || expr[pos] == '-' || expr[pos] == '*' || expr[pos] == '/')
    {
        node->data = expr[pos];
        pos++;
        node->Right = new Node;
        node->Right->Left = NULL;
        node->Right->Right = NULL;
        MakeTree(expr, pos, node->Right);
    }

    if(expr[pos] == ')') 
        {
            pos++;
            return;
        }
}
void Tree::MakeTree(字符串expr、int&pos、Node*Node)
{
如果(expr[pos]=='(')
{
pos++;
节点->左=新节点;
节点->左->左=空;
节点->左->右=空;
MakeTree(expr、pos、node->Left);
MakeTree(expr、pos、node);
返回;
}
如果(expr[pos]>='0'和&expr[pos]数据=expr[pos];
pos++;
返回;
}
如果(expr[pos]='+'| | expr[pos]='-'| | expr[pos]='*'| | expr[pos]='/'))
{
节点->数据=expr[pos];
pos++;
节点->右=新节点;
节点->右->左=空;
节点->右->右=空;
MakeTree(表达式、位置、节点->右侧);
}
如果(expr[pos]==')')
{
pos++;
返回;
}
}

如果你能提供优化我的算法的解决方案,那将是非常棒的,因为我觉得它不是很好。

你试图解决问题的方式太简单了。这不起作用。为什么?因为你对特定符号的反应不仅取决于符号本身,还取决于你在哪个上下文中得到那个符号。所以你会ld必须实现一个状态机,在不同的状态下,即使对相同的输入,您也会做出不同的反应。例如,当您得到符号“-”时,它是什么,表达式的一部分,如“5-3”或“-6”的一元负号?这取决于您收到符号时处于的状态。因此,处理语法解析的完整逻辑的实现是不可能的这就是为什么在实际的程序中,人们通常不手动操作,而是使用诸如lex/flex或boost library spirit等特殊工具。这并不意味着你不能在学习中实现这一点,但对于stackoverflow格式来说,这个问题的答案可能太大,而且已经得到了回答在很多书中都有。所以,找一本语法分析的好书,或者试着在互联网上找到如何实现一个简单计算器的教程。

你试图解决问题的方法太简单了。那不管用。为什么?因为你对特定符号的反应不仅取决于符号本身,还取决于你在什么上下文中得到那个符号l、 因此,您必须实现一个状态机,在不同的状态下,即使是对相同的输入,您也会做出不同的反应。例如,当您得到符号“-”时,它是什么,表达式的一部分,如“5-3”或“-6”中的一元负号?这取决于您收到符号时处于的状态。因此,实现完整的语法处理逻辑解析并不是那么简单,更糟糕的是相当单调。这就是为什么在实际程序中,人们通常不手动进行解析,而是使用诸如lex/flex或boost library spirit等特殊工具。这并不意味着你无法实现学习,但对于stackoverflow格式来说,这个问题的答案可能太大了,而且是already在很多书中都回答了这个问题。所以,找一本语法分析的好书,或者试着在互联网上找到如何实现一个简单计算器的教程。

这个程序的目的是什么?学习编程还是制作一个真正的解析器?只是为了练习。我想制作一个使用二叉树计算表达式的程序,但我仍在使用它从包含表达式的给定字符串构建树。是的,这是可能的,但您必须定义运算符之间的优先规则(*before+,等等)。但是我应该使用什么算法?您能提供一个伪代码或其他什么吗?看看您是否能掌握dragon book(经典编译器教科书)。这将引导您了解定义语法的基础知识。这个程序的目的是什么?学习编程或制作一个真正的解析器?只是为了练习。我想制作一个使用二叉树计算表达式的程序,但我仍在使用包含表达式的给定字符串构建树。嗯,这是可能的但是你必须定义操作符之间的优先规则(*before+,等等)。但是我应该使用什么算法呢?你能提供一个伪代码或者什么吗?看看你是否能拿到龙书(经典的编译器教科书)。这将带你了解定义语法的基础知识。