gpt4 book ai didi

Haskell - 从前缀表达式创建算术树

转载 作者:行者123 更新时间:2023-12-02 11:10:01 29 4
gpt4 key购买 nike

我想从前缀表示法创建算术二叉树。

我的树定义为:

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

我想将它转换为算术二叉树,如下所示: arithmetic tree

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

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

这基本上是来自 wikipedia 的算法

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 压入堆栈。

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

关于Haskell - 从前缀表达式创建算术树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37125331/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com