Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C/C+将后缀/前缀表达式显示为解析树+;_C++_C_Syntax_Tree - Fatal编程技术网

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

我已经成功地将中缀表达式转换为后缀表达式,并且还能够对后缀表达式求值,但我在使用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 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()传递给递归请求?“+-”:“|”+缩进