整数/分数四则运算表达式分析并给出详细运算过程,四则运算表达式,为我女儿练习分数四则运算
整数/分数四则运算表达式分析并给出详细运算过程,四则运算表达式,为我女儿练习分数四则运算
为我女儿练习分数四则运算而编写,可以输入任意长度四则运算表达式(整数/分数),稍微改一下也可以应用于小数和负数
import reimport fractionsimport mathimport syslevel = 0line = 1class node: def __init__(self, category=0): self.operator = ''## category=1 : leaf node## category=0 : intermediate node self.category = category self.leftChild = None self.rightChild = None self.parent = None self.bracelet = False self.value = '' self.result = ''def popStack(subOpStack, subNumStack): if len(subOpStack) == 0: temp = subNumStack.pop() return temp else: temp = node(0) temp.value = subOpStack.pop() tmp = subNumStack.pop() temp.rightChild = tmp temp.rightChild.parent = temp temp.leftChild = popStack(subOpStack, subNumStack) temp.leftChild.parent = temp return tempdef depthTree(temp): if temp.leftChild == None or temp.rightChild == None: return 0 leftLen = depthTree(temp.leftChild) + 1 rightLen = depthTree(temp.rightChild) + 1 return max(leftLen, rightLen)def parseTree(opStack, numStack, subOpStack, subNumStack): global level if len(opStack) == 0: if (len(numStack) > 0): nn = numStack.pop() subNumStack.insert(0, nn) localNode = popStack(subOpStack, subNumStack) return localNode op = opStack.pop() if (op in "+-"): localNode = node() localNode.value = op nn = numStack.pop() subNumStack.insert(0, nn) localNode.rightChild = popStack(subOpStack, subNumStack) localNode.leftChild = parseTree(opStack, numStack, subOpStack, subNumStack) localNode.rightChild.parent = localNode localNode.leftChild.parent = localNode return localNode elif (op in "*/"): nn = numStack.pop() subNumStack.insert(0, nn) subOpStack.insert(0, op) res = parseTree(opStack, numStack, subOpStack, subNumStack) return res elif (op == ")"): numStack1 = [] opStack1 = [] subOpStack1 = [] subNumStack1 = [] flag = True while flag: op = opStack.pop() if op == ")": level = level + 1 opStack1.insert(0, op) elif op == "(": if level == 0: nn = numStack.pop() numStack1.insert(0, nn) flag = False break; else: level = level - 1 opStack1.insert(0, op) else: opStack1.insert(0, op) nn = numStack.pop() numStack1.insert(0, nn) res = parseTree(opStack1, numStack1, subOpStack1, subNumStack1) res.bracelet = True numStack.append(res) res = parseTree(opStack, numStack, subOpStack, subNumStack) return resdef calculateExpress(expr, subExpr): if subExpr==None: return calculateExpress(expr, subExpr.leftChild) calculateExpress(expr, subExpr.rightChild) if (not subExpr.leftChild==None and not subExpr.leftChild==None and subExpr.leftChild.category == 1 and subExpr.rightChild.category == 1): left = fractions.Fraction(subExpr.leftChild.value) right = fractions.Fraction(subExpr.rightChild.value) op = subExpr.value if op=="+": result = left + right elif op=="-": result = left - right elif op=="*": result = left * right elif op=="/": result = left / right subExpr.category = 1 subExpr.value = str(result) subExpr.bracelet = False subExpr.leftChild = None subExpr.rightChild = None outputExpress(expr) returndef outputExpress(expr): global line print str(line)+":\\t", printExpress(expr) print line = line + 1 returndef printExpress(expr): if expr == None: return if expr.bracelet: print "(", printExpress(expr.leftChild) print expr.value, printExpress(expr.rightChild) if expr.bracelet: print ")", returnif __name__ == '__main__': str1 = '(1/9+1/8*(1/7+1/6)+1/9)/(1/2+(1/4+1/3)*1/2/(1/4+1/5))+1/2' pattern = '[\\(\\)\\+\\-\\*\\/]|\\d+/\\d+' result = re.findall(pattern, str1) operators = '()+-*/' opStack = [] numStack = [] subNumStack = [] subOpStack = [] for item in result: if item in operators: opStack.append(item) else: tmp = node(1) tmp.value = item numStack.append(tmp) oo = parseTree(opStack, numStack, subOpStack, subNumStack) calculateExpress(oo,oo)#该片段来自于http://byrx.net
相关内容
- 仿内置用法 按key分组成嵌套字典,key嵌套,在日常开发
- webpy的form 元素radio单选框bug修复,webpyradio,class Radio(
- 用Python生成目录树,Python生成目录树,[Python]代码#
- Inverse power method applied to a tridiagonal matrix in Python,inve
- 把图片列表合成一个GIF动画图片,图片列表gif动画,[P
- 用Python写个翻译工具,Python写翻译工具,[Python]代码
- python中使用sharp模块的简单范例,pythonsharp,from shapes
- 输入地名获得当地天气预报,地名当地天气预报,weath
- python根据月份和日得到星座,python星座,#计算星座def
- python获取图片的颜色信息,,image = Imag
评论关闭