C 从堆栈递归构建二进制表达式树背后的逻辑

C 从堆栈递归构建二进制表达式树背后的逻辑,c,binary-tree,expression-trees,C,Binary Tree,Expression Trees,我正在构建使用运算符、变量和整数的二元表达式树 用户输入表达式,我们根据空格对其进行标记,并将每个标记放入堆栈中 比如说, 用户输入:a b+ 我们的堆栈变成堆栈=[“+”,“b”,“a”] 我有一个创建表达式节点的函数 xpNode* createExpressionNode(char token[], xpNode *left, xpNode *right) 这就是我努力理解递归概念的地方,这是我提出的伪代码,帮助我理解这应该如何工作。如果有人能看一看,了解一下当堆栈为空时该怎么做,以及这

我正在构建使用运算符、变量和整数的二元表达式树

用户输入表达式,我们根据空格对其进行标记,并将每个标记放入堆栈中

比如说,

用户输入:a b+

我们的堆栈变成堆栈=[“+”,“b”,“a”]

我有一个创建表达式节点的函数

xpNode* createExpressionNode(char token[], xpNode *left, xpNode *right)
这就是我努力理解递归概念的地方,这是我提出的伪代码,帮助我理解这应该如何工作。如果有人能看一看,了解一下当堆栈为空时该怎么做,以及这里是否还有其他问题,我将不胜感激

xpNode* createTree(Stack *stack){
{
   xpNode *node;
   get the top of the stack and store it in data
   pop the stack
   if the stack is empty, do something //im lost on what to do here
   if the top is an integer, node = createExpressionNode(data, NULL NULL) //the left and right arguments will always be NULL because integer's wont have any children
   if the top is a variable, node = createExpressionNode(data, NULL, NULL) //the left and right arguments will always be NULL because variables wont have any children
   if the top is an operator, node = createExpressionNode(data, createTree(stack), createTree(stack)) //Operators have children so we need to recursively get them

   return node
}
输入的结果:a b+应该是一个如下所示的树:

     +
    / \
   a   b 

如果堆栈在那里为空,则输入格式中存在错误。例如,如果堆栈是
[+*23]
,则无法构建树-还需要一个值。

此表示法的要点不是不需要递归吗?逻辑应该是这样的

stack = an empty stack;
while (token = read_next_token()) {
  if (token is a term) {
    push(stack, createTerm(token));
  } else if (token is a unary operator) {
    push(stack, createUnOp(token, pop(stack)));
  } else if (token is a binary operator) {
    node *left, *right;
    left = pop(stack);
    right = pop(stack);
    push(stack, createBinOp(token, left, right));
  } else {
    error("unrecognized input");
  }
}

在输入的末尾,堆栈上应该有一个元素,它是表示整个表达式的树。如果堆栈末尾有多个元素,则表示输入格式不正确。如果您试图在堆栈为空时弹出堆栈,则输入格式不正确。

如果我错了,请纠正我,但如果堆栈为空,则完成操作。因此,用户在中输入表达式,然后将其转换为堆栈上的波兰符号?@RussellZahniser yes,用户以post fix表示法输入表达式。堆栈最终将始终为空,对吗?在一个完美的解析中,堆栈将有一个元素(整个解析的结果),下一个输入是
$
(epsilon)。+1,不幸的是,OP用了倒数第二个OP(二进制OP),与这里的完全相同。但是,嘿,生活和学习。这个答案是正确的,IMHO应该被标记为答案。@WhozCraig我仍将编辑我的答案以避免排序问题:)