C++ 使用C/C+将后缀/前缀表达式显示为解析树+;
我已经成功地将中缀表达式转换为后缀表达式,并且还能够对后缀表达式求值,但我在使用C/C为其生成解析树时遇到了问题++ 我的输出:C++ 使用C/C+将后缀/前缀表达式显示为解析树+;,c++,c,syntax,tree,C++,C,Syntax,Tree,我已经成功地将中缀表达式转换为后缀表达式,并且还能够对后缀表达式求值,但我在使用C/C为其生成解析树时遇到了问题++ 我的输出: enter the expression string a+b*c the expression is correct the postfix expression is - abc *+ enter the value of a-1 enter the va
enter the expression string a+b*c
the expression is correct
the postfix expression is - abc *+
enter the value of a-1
enter the value of b-2
enter the value of c-3
the postfix expression is -abc*+
result= 7
我还需要显示:语法树
+
/ \
* a
/ \
b c
任何反馈都会对我的项目非常有帮助
谢谢你
@劳埃德:谢谢你一直以来的帮助。我需要turbo C中的伪代码。我不懂Ruby。像下面这样“绘制”伪代码要容易得多:
+
a
*
b
c
或者,如果您想使用简单的字符图形(我已将+
和*
运算符更改为添加和Mul
,以避免与图形冲突):
这样做的诀窍是可以单独绘制子树(例如mul
树),然后在绘制外部树时使用合适的前缀绘制子树
事实上,如果您熟悉C++流缓冲区,可以创建前缀流缓冲区来处理前缀,并简单地打印内部树。
与您建议的风格相比,最大的区别在于您的风格根本无法扩展。例如,如果top操作符有两个大的子树,那么它们的距离会非常远
编辑:可以这样绘制稍微复杂一点的树:
Add
+---Sub
| +---Div
| | +---p
| | +---q
| +---y
+---Mul
+---b
+---c
EDIT:根据请求,下面是一些伪代码(顺便说一句,Ruby解释器可以接受这些伪代码)。但是,必须使用一个合适的C++数据结构来表示树。
# Return the drawn tree as an array of lines.
#
# node ::= string
# node ::= [string, node, node]
def render_tree(node, prefix0 = "", prefix = "")
if (node.is_a?(String))
puts prefix0 + node # Value
else
puts prefix0 + node[0] # Operator
render_tree(node[1], prefix + "+---", prefix + "| ")
render_tree(node[2], prefix + "+---", prefix + " ")
end
end
render_tree(["Add", ["Sub", ["Div", "p", "q"], "y"], ["Mul", "b", "c"]])
按如下方式“绘制”它们要容易得多:
+
a
*
b
c
或者,如果您想使用简单的字符图形(我已将+
和*
运算符更改为添加和Mul
,以避免与图形冲突):
这样做的诀窍是可以单独绘制子树(例如mul
树),然后在绘制外部树时使用合适的前缀绘制子树
事实上,如果您熟悉C++流缓冲区,可以创建前缀流缓冲区来处理前缀,并简单地打印内部树。
与您建议的风格相比,最大的区别在于您的风格根本无法扩展。例如,如果top操作符有两个大的子树,那么它们的距离会非常远
编辑:可以这样绘制稍微复杂一点的树:
Add
+---Sub
| +---Div
| | +---p
| | +---q
| +---y
+---Mul
+---b
+---c
EDIT:根据请求,下面是一些伪代码(顺便说一句,Ruby解释器可以接受这些伪代码)。但是,必须使用一个合适的C++数据结构来表示树。
# Return the drawn tree as an array of lines.
#
# node ::= string
# node ::= [string, node, node]
def render_tree(node, prefix0 = "", prefix = "")
if (node.is_a?(String))
puts prefix0 + node # Value
else
puts prefix0 + node[0] # Operator
render_tree(node[1], prefix + "+---", prefix + "| ")
render_tree(node[2], prefix + "+---", prefix + " ")
end
end
render_tree(["Add", ["Sub", ["Div", "p", "q"], "y"], ["Mul", "b", "c"]])
@劳埃德:谢谢。。如果您能为我们提供上述方法的示例代码,那将非常有帮助。“前缀”streambuf只是过滤streambuf的一个特例——boost::iostream
中对这类事情有很好的支持。基本上,过滤器会有一个标志isAtStartOfLine
,初始化为true
,并在每次输出字符时设置为ch='\n'
。当被要求输出字符时,如果是起始线
,则首先输出前缀。@newars:事实上,这是一个很好的练习,因此我建议您自己尝试一下。(为了简单起见,忘了我说过的为streambuffers加前缀的内容。)提示:编写一个函数,它采用树表示和两个前缀,一个用于子树的第一行,一个用于正文。对子树递归调用函数,前缀较长。如果你觉得自己搞不懂,我会在这里为你发布一些伪代码。虽然我很喜欢streambuf过滤解决方案(Dietmar Kühl和我是它的发明者),但在这种情况下,它可能会有些过分。只需将另一个std::string indent
参数传递给print
函数,该函数默认为空字符串,并使用表达式indent.empty()传递给递归请求?“+-”:“|”+缩进
@LD:谢谢。。如果您能为我们提供上述方法的示例代码,那将非常有帮助。“前缀”streambuf只是过滤streambuf的一个特例——boost::iostream
中对这类事情有很好的支持。基本上,过滤器会有一个标志isAtStartOfLine
,初始化为true
,并在每次输出字符时设置为ch='\n'
。当被要求输出字符时,如果是起始线
,则首先输出前缀。@newars:事实上,这是一个很好的练习,因此我建议您自己尝试一下。(为了简单起见,忘了我说过的为streambuffers加前缀的内容。)提示:编写一个函数,它采用树表示和两个前缀,一个用于子树的第一行,一个用于正文。对子树递归调用函数,前缀较长。如果你觉得自己搞不懂,我会在这里为你发布一些伪代码。虽然我很喜欢streambuf过滤解决方案(Dietmar Kühl和我是它的发明者),但在这种情况下,它可能会有些过分。只需将另一个std::string indent
参数传递给print
函数,该函数默认为空字符串,并使用表达式indent.empty()传递给递归请求?“+-”:“|”+缩进
。