Haskell - 从前缀表达式创建算术树
Haskell - create artihmetic tree from prefix expression
我想从前缀符号创建算术二叉树。
我的树定义为:
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
,其中 x
和 y
是 Tree
的值堆栈上的前两个值。
我想从前缀符号创建算术二叉树。
我的树定义为:
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
,其中 x
和 y
是 Tree
的值堆栈上的前两个值。