代码拉取完成,页面将自动刷新
# -*- coding: utf-8 -*-
# @Time : 2018/3/26 12:36
# @Author : Lv Zhangrun
# @Site :
# @File : Calculate.py
# @Software: PyCharm
import Stack
import Fraction
class Calculator:
def __init__(self):
self.numberStack = Stack.Stack()
self.symbolStack = Stack.Stack()
self.top = ""
self.listOperators = ["+", "-", "×", "÷", "(", ")","="]
def getFraction(self, strFraction, featureSymbol):
listFraction = strFraction.split(featureSymbol)
if featureSymbol=="/":
return listFraction
else:
strTemp = listFraction[1]
listTemp = strTemp.split("/")
temp = []
temp.append(int(listFraction[0]) * int(listTemp[1]) + int(listTemp[0]))
temp.append(int(listTemp[1]))
return temp
def symbolLeftBracket(self, symbol):
return True
def symbolMultipleSign(self, symbol):
if self.top == "+" or self.top == "-":
return True
else:
return False
def symbolDivisionSign(self, symbol):
if self.top == "+" or self.top == "-":
return True
else:
return False
def symbolPlusSign(self, symbol):
return False
def symbolMinusSign(self, symbol):
return False
def symbolRightBracket(self, symbol):
return False
def symbolEqualSign(self, symbol):
return False
def comparePri(self, symbol):
switch = {
"(": self.symbolLeftBracket("("),
"×": self.symbolMultipleSign("×"),
"÷": self.symbolDivisionSign("÷"),
"+": self.symbolPlusSign("+"),
"-": self.symbolMinusSign("-"),
")": self.symbolRightBracket(")"),
"=": self.symbolEqualSign("=")
}
if self.symbolStack.isEmpty():
return True
self.top = self.symbolStack.peek()
if self.top == "(":
return True
if symbol not in switch.keys():
return True
else:
return switch[symbol]
def checkBrackets(self, expression):
stack = Stack.Stack()
b = False
for i in expression:
if i == "(":
stack.push(i)
if i == ")":
if stack.isEmpty() or stack.pop() != "(":
return False
if i == "=":
if b:
return False
b = True
if stack.isEmpty() == False:
return False
if expression[len(expression) - 1:] != "=":
return False
return True
def calculate(self, expression):
expression.strip() # 去空格
if len(expression) > 1 and expression[len(expression) - 1:] != "=":
expression = expression + "="
if self.checkBrackets(expression) == False:
print("错误:表达式有误!")
return "0"
listTemp = []
for element in expression:
if element not in self.listOperators:
listTemp.append(element)
else:
strTemp = ""
for i in listTemp:
strTemp = strTemp + str(i)
if len(strTemp) != 0:
self.numberStack.push(strTemp)
listTemp.clear()
while self.comparePri(element) == False and self.symbolStack.isEmpty() == False:
number1 = str(self.numberStack.pop())
number2 = str(self.numberStack.pop())
# print("number1:"+number1)
# print("number2:"+number2)
# fraction1 = None
# fraction2 = None
if "’" in number1:
temp1 = self.getFraction(number1, "’")
# print("temp1:"+str(temp1))
fraction1 = Fraction.Fraction(temp1[0], temp1[1])
elif "’" not in number1 and "/" in number1:
temp1 = self.getFraction(number1, "/")
# print("temp1:" + str(temp1))
fraction1 = Fraction.Fraction(temp1[0], temp1[1])
else:
fraction1 = Fraction.Fraction(int(number1), 1)
if "’" in number2:
temp2 = self.getFraction(number2, "’")
# print("temp2:" + str(temp2))
fraction2 = Fraction.Fraction(temp2[0], temp2[1])
elif "’" not in number2 and "/" in number2:
temp2 = self.getFraction(number2, "/")
# print("temp2:" + str(temp2))
fraction2 = Fraction.Fraction(temp2[0], temp2[1])
else:
fraction2 = Fraction.Fraction(int(number2), 1)
symbol = self.symbolStack.pop()
if symbol == "+":
self.numberStack.push(fraction2.plus(fraction1).getResult())
elif symbol == "-":
self.numberStack.push(fraction2.minus(fraction1).getResult())
elif symbol == "×":
self.numberStack.push(fraction2.multiply(fraction1).getResult())
elif symbol == "÷":
if fraction1.numerator == 0:
print("错误:不能出现除数为0的情况")
return None
else:
self.numberStack.push(fraction2.divide(fraction1).getResult())
if element != "=":
self.symbolStack.push(element)
if element == ")":
self.symbolStack.pop()
self.symbolStack.pop()
return self.numberStack.pop()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。