Evo implementacije ovog algoritma u Pythonu.
def push_stack(stackArr,ele):
stackArr.append(ele)
def pop_stack(stackArr):
return stackArr.pop()
def isOperand(who):
if(not(isOperator(who)) and (who != "(") and (who != ")")):
return 1
return 0
def isOperator(who):
if(who == "+" or who == "-" or who == "*" or who == "/" or who == "^"):
return 1
return 0
def topStack(stackArr):
return(stackArr[len(stackArr)-1])
def isEmpty(stackArr):
if(len(stackArr) == 0):
return 1
return 0
def prcd(who):
if(who == "^"):
return(5)
if((who == "*") or (who == "/")):
return(4)
if((who == "+") or (who == "-")):
return(3)
if(who == "("):
return(2)
if(who == ")"):
return(1)
def ip(infixStr,postfixStr = [],retType = 0):
postfixStr = []
stackArr = []
postfixPtr = 0
tempStr = infixStr
infixStr = []
infixStr = strToTokens(tempStr)
for x in infixStr:
if(isOperand(x)):
postfixStr.append(x)
postfixPtr = postfixPtr+1
if(isOperator(x)):
if(x != "^"):
while((not(isEmpty(stackArr))) and (prcd(x) <= prcd(topStack(stackArr)))):
postfixStr.append(topStack(stackArr))
pop_stack(stackArr)
postfixPtr = postfixPtr+1
else:
while((not(isEmpty(stackArr))) and (prcd(x) < prcd(topStack(stackArr)))):
postfixStr.append(topStack(stackArr))
pop_stack(stackArr)
postfixPtr = postfixPtr+1
push_stack(stackArr,x)
if(x == "("):
push_stack(stackArr,x)
if(x == ")"):
while(topStack(stackArr) != "("):
postfixStr.append(pop_stack(stackArr))
postfixPtr = postfixPtr+1
pop_stack(stackArr)
while(not(isEmpty(stackArr))):
if(topStack(stackArr) == "("):
pop_stack(stackArr)
else:
postfixStr.append(pop_stack(stackArr))
returnVal = ''
for x in postfixStr:
returnVal += x
if(retType == 0):
return(returnVal)
else:
return(postfixStr)
def pi(postfixStr):
stackArr = []
tempStr = postfixStr
postfixStr = []
postfixStr = tempStr
for x in postfixStr:
if(isOperand(x)):
push_stack(stackArr,x)
else:
temp = topStack(stackArr)
pop_stack(stackArr)
pushVal = '(' + topStack(stackArr) + x + temp + ')'
pop_stack(stackArr)
push_stack(stackArr,pushVal)
return(topStack(stackArr))
def strToTokens(str):
strArr = []
strArr = str
tempStr = ''
tokens = []
tokens_index = 0
count = 0
for x in strArr:
count = count+1
if(isOperand(x)):
tempStr += x
if(isOperator(x) or x == ")" or x == "("):
if(tempStr != ""):
tokens.append(tempStr)
tokens_index = tokens_index+1
tempStr = ''
tokens.append(x)
tokens_index = tokens_index+1
if(count == len(strArr)):
if(tempStr != ''):
tokens.append(tempStr)
return(tokens)
def PostfixSubEval(num1,num2,sym):
num1,num2 = float(num1),float(num2)
if(sym == "+"):
returnVal = num1 + num2
if(sym == "-"):
returnVal = num1 - num2
if(sym == "*"):
returnVal = num1 * num2
if(sym == "/"):
returnVal = num1 / num2
if(sym == "^"):
returnVal = pow(num1,num2)
return returnVal
def PostfixEval(postfixStr):
temp = postfixStr
postfixStr = []
postfixStr = temp
stackArr = []
for x in postfixStr:
if(isOperand(x)):
push_stack(stackArr,x)
else:
temp = topStack(stackArr)
pop_stack(stackArr)
pushVal = PostfixSubEval(topStack(stackArr),temp,x)
pop_stack(stackArr)
push_stack(stackArr,pushVal)
return(topStack(stackArr))
def InfixEval(infixStr):
return PostfixEval(ip(infixStr,[],1))
def menu():
def again():
flag = raw_input('Continue (y/n)?')
if flag not in ('y','n'):
again()
if(flag == 'y'):
menu()
if(flag == 'n'):
exit
print '\n############################'
print '# Infix-Postfix Calculator #'
print '############################'
print '\n(1) Infix to Postfix'
print '(2) Postfix to Infix'
print '(3) Evaluate Infix'
print '(4) Evaluate Postfix'
print '(5) Exit'
opt = raw_input("Enter option (1/2/3/4/5): ")
if opt in ('1','2','3','4','5'):
if(opt == '1'):
what = raw_input('\nEnter Infix String: ')
print 'Postfix String: ', ip(what)
if(opt == '2'):
what = raw_input('\nEnter Postfix String: ')
print 'Infix String: ', pi(what)
if(opt == '3'):
what = raw_input('\nEnter Infix String: ')
print 'Infix Value: ', InfixEval(what)
if(opt == '4'):
what = raw_input('\nEnter Infix String: ')
print 'Postfix Value: ', PostfixEval(what)
if(opt == '5'):
exit
if(opt != '5'):
again()
else:
menu()
menu()