我正在构建使用运算符,变量和整数的二进制表达式树。
用户输入表达式并根据空格对其进行标记,并将每个标记放入堆栈。
例如,
用户输入:a b +
我们的堆栈变为Stack = [“+”,“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
答案 0 :(得分:1)
这种表示的重点不是需要递归吗?逻辑应该就像
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");
}
}
在输入结束时,堆栈上应该有一个元素,它是表示整个表达式的树。如果最后堆栈上有多个元素,则输入格式不正确。如果您在任何时候尝试在空白时弹出堆栈,则输入格式不正确。
答案 1 :(得分:0)
如果堆栈在那里是空的,那么输入格式就会出错。例如,如果堆栈为[+ * 2 3]
,则无法构建树 - 需要再增加一个值。