我想从前缀符号创建算术二叉树。
我的树定义为:
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来表达它。
有人能给我一个提示吗?
这里有一个提示——在您的foldingFunction
方法中,第一个参数是一个数字列表。使用相同的方法,但这一次第一个参数将是Tree
值的列表。
当折叠功能遇到一个数字时,例如“3”,您需要将Leaf 3
推到堆栈上。
当遇到像*
这样的运算符时,您将需要推送节点x"*"y
,其中x
和y
是上的前两个值的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等方法的类),但我认为我需要一种