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

haskell-将后缀表达式转换为二叉树

宇文金鑫
2023-03-14

我正在尝试将后缀表达式转换为二叉树。My函数将标记(字符串)列表作为参数。

每次我给函数任何输入时,调试器都会写一条消息:函数“add”中的非穷举模式。

我的想法是:一个接一个地读取标记,然后确定它是运算符还是操作数。如果是操作数,则不要将任何节点保存到树中,并将数字存储到堆栈中。否则,我用操作符创建一个节点,从堆栈中弹出符号,将它们设置为新节点的子节点,并将操作符推送到堆栈中。

如果字符串列表为空,函数将打印二叉树。

有人能给我解释一下,为什么函数会给出非穷举模式错误,我如何修复函数?

data Tree = Leaf String | Empty | Node Tree String Tree deriving (Show)

add :: Tree -> [String] -> [Tree] -> Tree
add (Node l v p) [] stack = (Node l v p)
add Empty (x:xs) []
        | x `elem` ["*","-","+"] = add (Leaf x) xs [Leaf x]
        | otherwise = add Empty xs [Leaf x]
add Empty (x:xs) (a:b:bs)
        | x `elem` ["*","-","+"] = add (Node b x a) xs (Leaf x:a:b:bs)
        | otherwise = add Empty xs (Leaf x:a:b:bs)
add (Leaf x) token (a:b:bs)
        | x `elem` ["*","-","+"] = add (Node b x a) token (Leaf x:bs)
        | otherwise = Leaf x
add (Node l v p) (x:xs) (a:b:bs)
        | x `elem` ["*","-","+"] = add (Node b x a) xs (Leaf x:bs)
        | otherwise = add (Node l v p) xs (Leaf x:a:b:bs) 

parse :: String -> Tree
parse input = add Empty (words (toPostfix input)) []

共有1个答案

萧丁雨
2023-03-14

我通过简单的例子再现了错误:

add Empty ["10", "1", "+"] []

程序成功地将Leaf"10"添加到堆栈中,但是不能将Leaf"1"添加到堆栈中,因为add使用以下参数调用:

add Empty ["1", "+"] [Leaf "10"]

但是它与任何模式都不匹配,因为addempty(x:xs)(a:b:bs)期望第三个参数包含两个Tree元素和一个列表。因此,需要一个模式,该模式将第三个参数匹配为具有一个元素的列表。例如,添加:

add Empty (x:xs) [a] = add Empty xs (Leaf x:[a])

修复错误并打印以下内容:

Node (Leaf "10") "+" (Leaf "1")

希望它能帮助你继续完成任务,除非你已经解决了:)

 类似资料:
  • 本文向大家介绍将中缀转换为后缀表达式,包括了将中缀转换为后缀表达式的使用技巧和注意事项,需要的朋友参考一下 前缀表达式是人类可读和可解的。我们可以轻松地区分算子的顺序,也可以在计算数学表达式时先使用括号将其求解。计算机无法轻松地区分运算符和括号,这就是为什么需要后缀转换的原因。 要将中缀表达式转换为后缀表达式,我们将使用堆栈数据结构。通过从左到右扫描infix表达式,当我们得到任何操作数时,只需将

  • 作为Java赋值的一部分,我必须获取输入算术表达式并将其存储在二叉树中。 我已经完成了赋值所需的一切,除了我在表达式的字符串中读取并将其存储在二叉树中的部分。 我创建了一个名为BinaryTree的类。它唯一的字段是一个称为根的树节点。此树节点在BinaryTree中定义为内部类。它有3个字段、一个通用数据字段和两个子字段(左和右),它们是BinaryTree类型。 我很难定义一个算法来读取像这样

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

  • 我没有得到正确的输出为这个程序得到abcde-*给输入在主 这个程序是将表达式从中缀转换为后缀这里是算法 算法1。从左到右扫描中缀表达式。 如果扫描的字符是操作数,则将其输出。 否则, ......3.1如果扫描的运算符的优先级大于堆栈中运算符的优先级(或者堆栈是空的),则推送它。...... 3.2否则,从堆栈中弹出操作符,直到被扫描操作符的优先级小于-等于位于堆栈顶部的操作符的优先级。将扫描的

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

  • 我的讲师给了我一个任务,让我创建一个程序,使用堆栈将表达式和中缀转换为后缀。我制作了堆栈类和一些函数来读取中缀表达式。 但是这个函数,叫做,它负责使用堆栈将数组inFix中的inFix表达式转换为数组postFix中的postfix表达式,并没有做它应该做的事情...你们能帮帮我告诉我哪里做错了吗? 下面是从中缀转换为后缀的函数的代码,是我需要帮助修复的代码: 注意:convertToPostfi