题目如下:

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. 从“int中提取高八位”开始的学习

    今天有个学弟问了一个问题,怎么提取int中的高八位. 这个是个非常基础的问题,随便用位运算瞎搞几下就出来了. 看到这个问题的时候,也不知道我当初想了些啥,想了个骚操作,用memcpy把int放到字符串 ...

  2. vue--过滤器(私有,全局)

    过滤器 概念:Vue.js 允许你自定义过滤器,可被用作一些常见的文本格式化.过滤器可以用在两个地方:mustache 插值和 v-bind 表达式.过滤器应该被添加在 JavaScript 表达式的 ...

  3. c++ tcp 服务器和客户端例子

    目标:  完成一个精简TCP服务器,可接收来自多个用户的请求,并返回结果. 思路:  (1)服务器      C++ TCP服务器的实现主要由以下几个函数来完成:        a)socket    ...

  4. java 依据文件名判断mime类型

    依据文件名称判断mime类型 import java.util.HashMap; import java.util.Map; /** * 依据文件名获取MimeType */ public class ...

  5. [转帖]Linux网络管理员不得不了解的系统目录/proc/sys/net/(网络配置)

    Linux网络管理员不得不了解的系统目录/proc/sys/net/(网络配置) https://blog.csdn.net/u013485792/article/details/76416836 需 ...

  6. [转帖]软件的变革与 AOT

    软件的变革与 AOT https://www.colabug.com/851475.html 文章写的很牛B .. 前言 AOT 即 Ahead of Time Compilation,即运行前编,与 ...

  7. 思考--mysql 分库分表的思考

    查询不在分库键上怎么办,扫描所有库?由于分库了,每个库扫描很快?所以比单个表的扫描肯定快,可以这样理解吗. 多表jion怎么弄,把内层表发给每个分库吗? citus,tidb 都有这些问题,citus ...

  8. jQuery-点击按钮页面滚动到顶部,底部,指定位置

    $('.scroll_top').click(function(){$('html,body').animate({scrollTop: '0px'}, 800);}); //页面滚动至顶部 $('. ...

  9. HDU 1789 Doing Homework again(排序,DP)

    Doing Homework again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  10. C++ 类学习笔记 :: 作用域限定符

    类与封装的概念: 1.类: 类的实现.类的使用. 当使用类的时候,不需要关心实现的细节.当创建类的时候,才需要考虑到内部具体的实现细节. 2.类的封装: 成员变量,C++用于表示属性的变量. 成员函数 ...