当前位置: 首页 > 知识库问答 >
问题:

haskell-从前缀表达式创建人工树

邹修真
2023-03-14

我想从前缀符号创建算术二叉树。

我的树定义为:

data Tree a = Leaf Int | Node Tree String Tree deriving (Show)

我想把它转换成算术二叉树,像这样:算术树

为了从字符串计算前缀表达式,我编写了以下函数:

evaluatePrefix:: String -> Int
evaluatePrefix expression = head (foldl foldingFunction [] (reverse (words  ( expression))) )
where   foldingFunction (x:y:ys) "*" = (x * y):ys  
        foldingFunction (x:y:ys) "+" = (x + y):ys  
        foldingFunction (x:y:ys) "-" = (x - y):ys  
        foldingFunction (x:y:ys) "/" = ( x `div` y):ys  
        foldingFunction xs numberString = read numberString:xs 

这基本上是维基百科的算法

Scan the given prefix expression from right to left
for each symbol
 {
  if operand then
    push onto stack
  if operator then
   {
    operand1=pop stack
    operand2=pop stack
    compute operand1 operator operand2
    push result onto stack
   }
 }
return top of stack as result

现在我想将前缀表达式转换为算术树,这样我就可以遍历树并以这种方式对其求值,或者将其转换为后缀或中缀。

我怎么能这么做?

我想在折叠时不要计算堆栈,而是创建节点,但我不知道如何用Haskell来表达它。

有人能给我一个提示吗?

共有1个答案

颛孙安康
2023-03-14

这里有一个提示——在您的foldingFunction方法中,第一个参数是一个数字列表。使用相同的方法,但这一次第一个参数将是Tree值的列表。

当折叠功能遇到一个数字时,例如“3”,您需要将Leaf 3推到堆栈上。

当遇到像*这样的运算符时,您将需要推送节点x"*"y,其中xy是上的前两个值的Tree值堆栈。

 类似资料:
  • 当你编写一个算术表达式如 B*C 时,表达式的形式使你能够正确理解它。在这种情况下,你知道 B 乘以 C, 因为乘法运算符 * 出现在表达式中。这种类型的符号称为中缀,因为运算符在它处理的两个操作数之间。看另外一个中缀示例,A+B*C,运算符 + 和 * 仍然出现在操作数之间。这里面有个问题是,他们分别作用于哪个运算数上,+ 作用于 A 和 B , 还是 * 作用于 B 和 C?表达式似乎有点模糊

  • 我正在尝试将后缀表达式转换为二叉树。My函数将标记(字符串)列表作为参数。 每次我给函数任何输入时,调试器都会写一条消息:函数“add”中的非穷举模式。 我的想法是:一个接一个地读取标记,然后确定它是运算符还是操作数。如果是操作数,则不要将任何节点保存到树中,并将数字存储到堆栈中。否则,我用操作符创建一个节点,从堆栈中弹出符号,将它们设置为新节点的子节点,并将操作符推送到堆栈中。 如果字符串列表为

  • 本文向大家介绍中缀表达式转后缀表达式相关面试题,主要包含被问及中缀表达式转后缀表达式时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 对于中缀表达式,遇到操作数直接将其输出,如果遇到操作符和左括号全部压入栈中,若遇到右括号则将栈中元素全部弹出,直到遇到左括号为止。压栈过程中,若遇到其它操作符,从栈中弹出元素直到遇到更低优先级的操作符为止。

  • 本文向大家介绍将中缀转换为前缀表达式,包括了将中缀转换为前缀表达式的使用技巧和注意事项,需要的朋友参考一下 要通过计算机求解表达式,我们可以将其转换为后缀形式或前缀形式。在这里,我们将看到中缀表达式如何转换为前缀形式。 首先,中缀表达式反转。注意,对于反转,圆括号也将反转。 例如:表达式:A + B *(C-D) 反转后的表达式为:)D – C(* B + A 因此我们需要将左括号转换为右括号,反

  • 我需要的算法,将检查是否给定的表达式是中缀,后缀或前缀表达式。我尝试了一种方法,通过检查字符串的第一个或最后两个项,例如。 AB如果字符串的第一个索引中有一个运算符,那么它就是一个前缀 AB如果字符串的最后一个索引中有一个运算符,那么它就是一个后缀 否则它就是一个中缀。 但是感觉不太合适,所以请建议我一个更好的算法。

  • 问题内容: 我必须在Java中创建一个算术评估器。为此,我必须在二叉树中解析一个代数表达式,然后计算并返回结果。因此,对于第一步,我如何解析二叉树中的表达式?我知道理论,但是我的问题是如何用Java做到这一点。 但是我缺少基本的技巧或方法。我知道如何创建节点(我有一个带有returnNodeValue,isLeaf,isDoubleNode,isSingleNode等方法的类),但我认为我需要一种