Pythonは逆ポーランド計算機を実現
19814 ワード
Pythonは逆ポーランド計算機を実現
#----------------------------- --------------------------------
class Stack():#
def __init__(self,):
self.stack = []
def push(self,data):#
self.stack.append(data)
def pop(self):#
return self.stack.pop()
def is_empty(self):#
return not len(self.stack)
def top(self):#
if self.is_empty():
return None
return self.stack[-1]
class InversPolishCalculator(object):#
def deal(self,exspression):# , ,
list_expression = self.get_list_expression(exspression)
stack = Stack() #
for ele in list_expression: #
if ele.replace('.','').isdigit(): #
stack.push(ele)
else: # , ,
ret = self.operation(ele, float(stack.pop()), float(stack.pop()))
stack.push(ret)
return '%.2f'% stack.pop()#
def operation(self,sign, num2, num1): #
if sign == '*':
return num1 * num2
if sign == '/':
return num1/num2
if sign == '+':
return num1 + num2
if sign == '-':
return num1 - num2
def deal_str(self,exspression):# ,
status = 0
res = ''
exspression = exspression.strip().replace(' ','')
for ele in exspression:
if ele.isdigit() or ele =='.':
if status == 1:
res =res.strip(' ')
res = res + ele + ' '
else:
status = 1
res= res+ele+' '
else:
status = 0
res = res + ele + ' '
return res.strip().split(' ')
def get_list_expression(self,exspression):#
lst = self.deal_str(exspression)
s1 = Stack()
s2 = Stack()
for ele in lst:
if ele.replace('.','').isdigit():
s2.push(ele)
else:
self.deal_symbol(ele,s1,s2)
while not s1.is_empty():
s2.push(s1.pop())
res = []
while not s2.is_empty():
res.append(s2.pop())
return res[::-1]
def deal_symbol(self,ele,s1,s2):#
if s1.is_empty() or s1.top() == '(' or ele == '(':
s1.push(ele)
elif ele == ')':
while s1.top() != '(':
s2.push(s1.pop())
s1.pop()
elif self.get_priority(ele) > self.get_priority(s1.top()):
s1.push(ele)
else:
s2.push(s1.pop())
self.deal_symbol(ele,s1,s2)
def get_priority(self,sign):#
if sign=='*' or sign=='/':
return 2
elif sign=='+' or sign=='-':
return 1
if __name__ == '__main__':
exspression = input(' :')
Calculator = InversPolishCalculator()
ret = Calculator.deal(exspression)
print(' :',ret)
input()