Ok postfixToinfix seems to be ok
This commit is contained in:
parent
2f6c79ef84
commit
ed36cd7dc6
68
calculus.py
68
calculus.py
@ -139,30 +139,50 @@ def postfixToInfix(postfixExp):
|
|||||||
for (i,token) in enumerate(tokenList):
|
for (i,token) in enumerate(tokenList):
|
||||||
if token in "+-*/":
|
if token in "+-*/":
|
||||||
op2 = operandeStack.pop()
|
op2 = operandeStack.pop()
|
||||||
|
if get_main_op(op2) and (priority[get_main_op(op2)] < priority[token] or token in "-/"):
|
||||||
|
op2 = "( " + op2 + " )"
|
||||||
op1 = operandeStack.pop()
|
op1 = operandeStack.pop()
|
||||||
|
if get_main_op(op1) and (priority[get_main_op(op1)] < priority[token] or token in "/"):
|
||||||
|
op1 = "( " + op1 + " )"
|
||||||
res = "{op1} {op} {op2}".format(op1 = op1, op = token, op2 = op2)
|
res = "{op1} {op} {op2}".format(op1 = op1, op = token, op2 = op2)
|
||||||
|
|
||||||
parenthesis = False
|
|
||||||
if i+1 < len(tokenList):
|
|
||||||
if tokenList[i+1] in "+-*/":
|
|
||||||
if priority[token] < priority[tokenList[i+1]]:
|
|
||||||
res = "( " + res + " )"
|
|
||||||
parenthesis = True
|
|
||||||
if i+2 < len(tokenList) and not parenthesis:
|
|
||||||
if tokenList[i+2] in "+-*/":
|
|
||||||
if priority[token] < priority[tokenList[i+2]]:
|
|
||||||
res = "( " + res + " )"
|
|
||||||
|
|
||||||
operandeStack.push(res)
|
operandeStack.push(res)
|
||||||
|
|
||||||
#print("new token: {token}".format(token = token))
|
|
||||||
#print(" ".join(operandeStack +["!!"]+ tokenList[i+1:]))
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
operandeStack.push(token)
|
operandeStack.push(token)
|
||||||
|
|
||||||
return operandeStack.pop()
|
return operandeStack.pop()
|
||||||
|
|
||||||
|
def get_main_op(exp):
|
||||||
|
"""Getting the main operation of th expression
|
||||||
|
|
||||||
|
:param exp: the expression
|
||||||
|
:returns: the main operation (+, -, * or /) or 0 if the expression is only one element
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
priority = {"*" : 3, "/": 3, "+": 2, "-":2}
|
||||||
|
|
||||||
|
parStack = Stack()
|
||||||
|
tokenList = exp.split(" ")
|
||||||
|
|
||||||
|
if len(tokenList) == 1:
|
||||||
|
# Si l'expression n'est qu'un élément
|
||||||
|
return 0
|
||||||
|
|
||||||
|
main_op = []
|
||||||
|
|
||||||
|
for token in tokenList:
|
||||||
|
if token == "(":
|
||||||
|
parStack.push(token)
|
||||||
|
elif token == ")":
|
||||||
|
parStack.pop()
|
||||||
|
elif token in "+-*/" and parStack.isEmpty():
|
||||||
|
main_op.append(token)
|
||||||
|
|
||||||
|
return min(main_op, key = lambda s: priority[s])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def test(exp):
|
def test(exp):
|
||||||
"""Make various test on an expression
|
"""Make various test on an expression
|
||||||
@ -171,17 +191,21 @@ def test(exp):
|
|||||||
print("-------------")
|
print("-------------")
|
||||||
print("Expression ",exp)
|
print("Expression ",exp)
|
||||||
postfix = infixToPostfix(exp)
|
postfix = infixToPostfix(exp)
|
||||||
print("Postfix " , postfix)
|
#print("Postfix " , postfix)
|
||||||
print(computePostfix(postfix))
|
#print(computePostfix(postfix))
|
||||||
print("Bis")
|
#print("Bis")
|
||||||
print(computePostfixBis(postfix))
|
#print(computePostfixBis(postfix))
|
||||||
#print(postfixToInfix(postfix))
|
print(postfixToInfix(postfix))
|
||||||
|
#print(get_main_op(exp))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
exp = "1 + 3 * 5"
|
exp = "1 + 3 * 5"
|
||||||
test(exp)
|
test(exp)
|
||||||
|
|
||||||
|
exp = "2 * 3 * 3 * 5"
|
||||||
|
test(exp)
|
||||||
|
|
||||||
exp = "2 * 3 + 3 * 5"
|
exp = "2 * 3 + 3 * 5"
|
||||||
test(exp)
|
test(exp)
|
||||||
|
|
||||||
@ -199,6 +223,12 @@ if __name__ == '__main__':
|
|||||||
|
|
||||||
exp = "2 + 5 * ( 3 - 4 )"
|
exp = "2 + 5 * ( 3 - 4 )"
|
||||||
test(exp)
|
test(exp)
|
||||||
|
|
||||||
|
exp = "( 2 + 5 ) * ( 3 - 4 )"
|
||||||
|
test(exp)
|
||||||
|
|
||||||
|
exp = "( 2 + 5 ) * ( 3 * 4 )"
|
||||||
|
test(exp)
|
||||||
|
|
||||||
|
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user