Make a tool:convert algebraic expression to functional expression(2)
I got the data structure of stack and binary tree in last article,and finally I got a stack what can describe algebraic expression clearly.Now I can create a expression tree with this stack.
Create the expression tree
This expression tree is a binary tree because each function has 2 arguments commonly.So there are 3 things to describe an algebraic:operator,1st operand(orginal) and 2nd operand.I set binary tree node's left child is the 1st operand,right child is the 2nd operand and its value is the operator.
For example,1+2 is writen 1
2
3 +
/ \
1 2
Before create the expression tree,I have to deal with the stack I got before.Because that stack is a reverse array to describe the algebraic expression.
Reverse stack
1 | stack = Stack() |
Um..that's all.
And create an empty stack to store the operands temporarily while pop this stack.
Create expression tree and assign elements
1 | while stack.length() is not 0: |
By this way,I get the correct expression tree.
For example,I input "A+b-x*(12.13+51y)1.4121" before,now I
get a binary tree: 1
2
3
4
5
6
7
8
9
10
11 +
/ \
A -
/ \
b *
/ \
+ ^
/ \
+ 1.4121
/ \
51 y
Traverse the binary tree and create functional expression
This is an iterative process.I convert each child node into a functional expression,such as
1 | + |
will change to add(1,2)
And put this functional expression as its parent node's child,and
loop again and again,until only one node left. 1
2
3
4
5
6operators_name = {'+':'add','-':'mius','*':'muilt','/':'divide','^':'power'}
#create_function_expression
def cfe(Tree):
if Tree.value in operators_name:
Tree.value = operators_name[Tree.value] +'('+ cfe(Tree.left) +','+ cfe(Tree.right) +')'
return Tree.value
Test it,input "A+b-x*(12.13+51y)1.4121" and this script ouput add(A,mius(b,muilt(x,power(add(12.13,power(51,y)),1.4121))))
All script have been uploaded to Github: