题目如下:

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .

The expression string contains only non-negative integers, +, -, *, / operators , open ( and closing parentheses ) and empty spaces . The integer division should truncate toward zero.

You may assume that the given expression is always valid. All intermediate results will be in the range of [-2147483648, 2147483647].

Some examples:

"1 + 1" = 2
" 6-4 / 2 " = 4
"2*(5+5*2)/3+(6/2+8)" = 21
"(2+6* 3+5- (3*14/7+2)*5)+3"=-12 Note: Do not use the eval built-in library function.

解题思路:算法上没有什么技术难度,无非就是要考虑各种情况。我的方法是用两个栈分别保存运算符号和非运算符号(包括数字和括号)。遇到右括号后,往前找左括号,遇到乘号或者除号,直接计算出结果。

代码如下:(写的很乱,也没心情优化了)

class Solution(object):
operator = []
num = []
def calcMandD(self,v):
if len(self.operator) == 0 or len(self.num) == 0:
return False
if (self.operator[-1] == '*' or self.operator[-1] == '/') and (self.num[-1] != '(' and self.num[-1] != ')'):
if self.operator[-1] == '*' :
tmp = int(self.num[-1]) * int(v)
self.num[-1] = str(tmp)
else:
tmp = int(self.num[-1]) / int(v)
self.num[-1] = str(tmp)
del self.operator[-1]
return True
return False
def calcParentheses(self):
t1 = self.num[-1]
del self.num[-1] tn = []
to = [] tn.append(t1) while self.num[-1] != '(':
t2 = self.num[-1] to.insert(0, self.operator[-1])
tn.insert(0, t2)
del self.operator[-1]
del self.num[-1]
del self.num[-1] #del ( t1 = tn[0]
del tn[0]
while len(tn) > 0:
t2 = tn[0]
if to[0] == '+':
t1 = int(t1) + int(t2)
elif to[0] == '-':
t1 = int(t1) - int(t2)
del to[0]
del tn[0]
return str(t1)
#self.num.append(str(t1))
def calcAandM(self):
t1 = self.num[0]
del self.num[0]
while len(self.num) > 0:
t2 = self.num[0]
if self.operator[0] == '+':
t1 = int(t1) + int(t2)
elif self.operator[0] == '-':
t1 = int(t1) - int(t2)
del self.operator[0]
del self.num[0]
return int(t1) def calculate2(self, s):
n = ''
for i in s:
if i == ' ':
continue
if i == '+' or i == '-' or i == '*' or i == '/':
if n != '':
if self.calcMandD(n) == False:
self.num.append(n)
n = ''
self.operator.append(i)
continue
if i == '(':
if n != '':
self.num.append(n)
n = ''
self.num.append(i)
continue
if i == ')':
if n != '':
if self.calcMandD(n) == False:
self.num.append(n)
n = ''
ret = self.calcParentheses()
while len(self.operator) >0 and (self.operator[-1] == '*' or self.operator[-1] == '/') and (self.num[-1] != '(' and self.num[-1] != ')'):
if self.operator[-1] == '*':
#print self.num
#print self.operator
ret = int(self.num[-1]) * int(ret)
else:
ret = int(self.num[-1])/int(ret)
del self.operator[-1]
del self.num[-1]
self.num.append(ret) continue
if i>='' and i <= '':
n += i
if n!='':
if self.calcMandD(n) == False:
self.num.append(n) def calculate(self, s):
"""
:type s: str
:rtype: int
"""
self.operator = []
self.num = []
self.calculate2(s)
#print (self.operator)
#print (self.num)
return self.calcAandM()

【leetcode】Basic Calculator III的更多相关文章

  1. [LeetCode] 772. Basic Calculator III 基本计算器之三

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  2. leetcode 772.Basic Calculator III

    这道题就可以结合Basic Calculator中的两种做法了,分别是括号运算和四则运算的,则使用stack作为保持的结果,而使用递归来处理括号内的值的. class Solution { publi ...

  3. 【LeetCode】Broken Calculator(坏了的计算器)

    这道题是LeetCode里的第991道题. 题目描述: 在显示着数字的坏计算器上,我们可以执行以下两种操作: 双倍(Double):将显示屏上的数字乘 2: 递减(Decrement):将显示屏上的数 ...

  4. 【LeetCode】House Robber III(337)

    1. Description The thief has found himself a new place for his thievery again. There is only one ent ...

  5. 【leetcode】Combination Sum III(middle)

    Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...

  6. 【LeetCode】字符串 string(共112题)

    [3]Longest Substring Without Repeating Characters (2019年1月22日,复习) [5]Longest Palindromic Substring ( ...

  7. 【LeetCode】栈 stack(共40题)

    [20]Valid Parentheses (2018年11月28日,复习, ko) 给了一个字符串判断是不是合法的括号配对. 题解:直接stack class Solution { public: ...

  8. 【LeetCode】数学(共106题)

    [2]Add Two Numbers (2018年12月23日,review) 链表的高精度加法. 题解:链表专题:https://www.cnblogs.com/zhangwanying/p/979 ...

  9. 【LeetCode】哈希表 hash_table(共88题)

    [1]Two Sum (2018年11月9日,k-sum专题,算法群衍生题) 给了一个数组 nums, 和一个 target 数字,要求返回一个下标的 pair, 使得这两个元素相加等于 target ...

随机推荐

  1. Scratch少儿编程系列:(十)系列总结及后续计划

    一.系列文章的来由 本篇为该系列文章的一个简单总结, 从初次接触Scratch开始,在写本系列文章过程中,一边读书,一边通过例子做练习. 技术实现,对于我跟人来说,没有什么难度. 我相信,对于一个初次 ...

  2. SpringCloud解决了哪些问题?

    1.与分布式系统相关的复杂性 – 包括网络问题,延迟开销,带宽问题,安全问题. 2.处理服务发现的能力 – 服务发现允许集群中的进程和服务找到彼此并进行通信. 3.解决冗余问题 – 冗余问题经常发生在 ...

  3. python 并发编程 协程 目录

    python 并发编程 协程 协程介绍 python 并发编程 协程 greenlet模块 python 并发编程 协程 gevent模块 python 并发编程 基于gevent模块实现并发的套接字 ...

  4. HDU 1250 Hat's Fibonacci (递推、大数加法、string)

    Hat's Fibonacci Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  5. IM学习目录

    1. 浅谈即时通讯 https://www.cnblogs.com/shoshana-kong/p/9724963.html 2. im即时通讯  https://www.cnblogs.com/sh ...

  6. DataLinkLayer(数据链路层)

    DataLinkLayer(数据链路层) The Reference Model(参考模型) layer name 5 Application layer 4 TransPort layer 3 Ne ...

  7. cannot convert from pointer to base class 'QObject' to pointer to derived class 'subClass' via virtual base 'baseClass'

    QT 编译不过的另一个问题: 1. 新建一个console工程 QT -= gui CONFIG += c++ console CONFIG -= app_bundle # The following ...

  8. nginx配置本地域名反向代理实现本地多域名80访问

    什么是反向代理? 代理:通过客户机的配置,实现让一台服务器代理客户机,客户的所有请求都交给代理服务器处理. 反向代理:用一台服务器,代理真实服务器,用户访问时,不再是访问真实服务器,而是代理服务器. ...

  9. VS Code Python 全新发布!Jupyter Notebook 原生支持终于来了!

    VS Code Python 全新发布!Jupyter Notebook 原生支持终于来了! 北京时间 2019 年 10 月 9 日,微软发布了全新的 VS Code Python 插件,带来了众多 ...

  10. 编辑器IDE之VSCode

    很多时候面临换项目组,公司内部换等等,需要清除之前的权限,电脑更换等... 确实很烦人,所以记录也是给自己下次更加快速方便的使用 插件安装 个人常用的一些插件,发现好用的会更新 插件名 功能 vsco ...