给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。
表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2"
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
说明:
你可以假设所给定的表达式都是有效的。
请不要使用内置的库函数 eval。
来源:力扣(LeetCode)
代码如下:
# -*- coding: utf-8 -*-
#!/usr/bin/env python
"""
Created on Mon Aug 3 21:10:20 2020
@author: WowlNAN
@github: https://github.com/WowlNAN
@blog: https://blog.csdn.net/qq_21264377
"""
class Solution:
def calculate(self, s: str) -> int:
s=s.strip()
n=[]
a=''
for m in s:
if m in ['0','1','2','3','4','5','6','7','8','9']:
a+=m
elif m=='+':
if a!='':
n.append(a)
a=''
elif m=='-':
if a!='':
n.append(a)
a='-'
elif m=='*':
a+=m
elif m=='/':
a+=m
if a!='':
n.append(a)
#print(n)
b=0
c=0
for m in n:
if '*' in m and not '/' in m:
na=m.split('*')
b=1
for num in na:
b*=int(num)
b=int(b)
elif '/' in m and not '*' in m:
na=m.split('/')
b=int(na[0])
for i in range(1,len(na)):
b/=int(na[i])
b=int(b)
elif '/' in m and '*' in m:
na=m.split('*')
#print(na)
if '/' in na[0]:
naa=na[0].split('/')
b=int(naa[0])
for i in range(1,len(naa)):
b/=int(naa[i])
b=int(b)
#print(b)
else:
b=int(na[0])
for i in range(1, len(na)):
if '/' in na[i]:
naa=na[i].split('/')
b*=int(naa[0])
for j in range(1,len(naa)):
b/=int(naa[j])
b=int(b)
else:
b*=int(na[i])
b=int(b)
#print(b)
else:
b=int(m)
c+=b
c=int(c)
return c
print(Solution().calculate("1+2*3-4"))
感想:以前没认真思考表面觉得难。这道题难度是中等,实际上试过发现,好像没什么难度。大概是还没有使用括号,还是挺简单的,多试几次就稳当。
主要是实现语法树的部分功能。四则运算的运算符加减乘除+-*/,优先级是'*'=='/'>>'+'=='-'。这里主要是,先所有操作数按+号分离,带-号的视为负,组成数组。此时的情况是,数组的各个元素的和就是要追求的解。如果是数字,加入结果;若包含*和/号,则分三种情况:
1)纯乘法运算
这种比较容易,直接将该字符元素按*号分离,所有元素相乘得到的数加入结果。
2)纯除法运算
与1)类似。
3)乘除法复合运算
这个稍微复杂。有两种:一种是先按*号分离组成数组,检查元素是否包含/号,有则按2)运算,否则按1)运算;另一种是按/号分离组成数组,检查元素是否包含*号,有则按1)运算,否则按2)运算。
这里是第1中做法。