Leetcode 227.基本计算机II
1. 思路
(1)这道题要求实现基本计算机,一个字符串,有数字和非数字即运算符,这道题只有 + - * / 四种运算符,计算字符串的结果首先我就想到了用栈的思想,一开始两个栈一个存放 运算符,一个存放数字,空间占用很大;
(2)采用先计算乘除,结果存入栈内,再计算 栈内的+ -
(3)给出一开始写的,但总是通不过 ,就很离谱,把错误的也贴一下
注:ord()函数是将字符转化为ASCII,所以ord(s[i]) - ord(‘0’)就得到数字的大小
isdigit()函数是判断是否为数字的函数
2.步骤
(1)定义栈、常量等,(为什么pre_sign = '+'赋值为+ 因为+初始是不影响计算结果,本来字符串就是求所有字符的运算”和“)
(2)for 循环
if 判断当前字符是否不为空以及是否为数字,如果是,则转化为数字
if 判断非数字,即运算符,这里有一个条件是当i已经遍历到最后一个元素了,或者当前元素属于±*/中的一个运算符,判断属于哪种运算符号
+或-直接入栈
*或/ 先将栈顶元素弹出,与当前元素运算,再入栈;
结束求和 sum(stack)
class Solution:
def calculate(self,s):
n = len(s)
num = 0
pre_sign = '+'
stack = []
for i in range(n):
if s[i] != ' ' and s[i].isdigit():
num = num*10 + ord(s[i]) - ord('0')
if i == n-1 or s[i] in '+-*/':
if pre_sign == '+':
stack.append(num)
elif pre_sign == '-':
stack.append(-num)
elif pre_sign == '*':
stack.append(stack.pop()*num)
else:
stack.append(stack.pop()//num)
pre_sign = s[i]
num = 0
return sum(stack)
这个"14-3/2"用例一直通不过,看了其他大佬的才知道,是python的小坑,// 是向下取整,所以如果是负数的会通不过,直接选择int (stack.pop()/num)
stack.append(int(stack.pop()/num))