题目如下:

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. 前端深入之css篇丨2020年前,彻底掌握css动画

    马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所以就导致了 ...

  2. ios app真机测试到上架App Store详细教程-必看

    详细操作地址 http://www.applicationloader.net/blog/zh/88.html 苹果iOS APP真机调试测试和上架App Store视频教程 优酷 http://v. ...

  3. cocos2dx[3.2](5) 屏幕适配

    1.两个分辨率 1.1.窗口分辨率 在AppDelegate.cpp中有个设置窗口分辨率的函数.该函数是设置了我们预想设备的屏幕大小,也就是应用程序窗口的大小. // glView->setFr ...

  4. Metinfo5.1 /member/getpassword.php SQL注入

  5. USACO3.3 A Game【区间dp】

    这道题也是一道非常有意思的区间$dp$,和在纪中的这道题有点像:取数游戏 (除了取数规则其它好像都一样诶) 当时在纪中的时候就觉得这个$dp$非常不好想,状态定义都不是很容易想到. 但是做过一道这种题 ...

  6. 【miscellaneous】星光级超低照度摄像机技术分析

    低照度摄像机采用了超灵敏度图像传感器和独有的电子倍增和噪点控制技术能够极大地提高摄像机的灵敏度,并且具备24小时全彩色实时效果,绝无普通低照度摄像机出现的拖尾现象,以满足对夜间高品质监控的需求.    ...

  7. 手把手带你发布Nuget包-图文说话

    博客:https://www.cnblogs.com/24klr/

  8. navicat连接 mysql报错1251解决方案

    转自:https://blog.csdn.net/XDMFC/article/details/80263215 好不容易安装好mysql,但又出现了mysql客户端版本太低的问题.根据参考的这篇博客, ...

  9. effective_io_concurrency很重要的一个参数

    effective_io_concurrency (integer) Sets the number of concurrent disk I/O operations that PostgreSQL ...

  10. POJ - 2421 Constructing Roads(最小生成树&并查集

    There are N villages, which are numbered from 1 to N, and you should build some roads such that ever ...