python计算字符串数字的加减乘除带括号运算法不适用eval函数
时间: 2023-08-01 07:11:52 浏览: 59
可以使用栈来实现计算字符串数字的加减乘除带括号运算,不需要使用eval函数。具体实现步骤如下:
1. 定义一个栈,用来存储数字和运算符。
2. 遍历字符串,遇到数字则入栈,遇到运算符则判断栈顶元素是否为数字,如果是则将运算符入栈,否则弹出两个数字和一个运算符进行运算,将结果入栈。
3. 遇到左括号则直接入栈,遇到右括号则弹出栈顶元素直到遇到左括号为止,将弹出的元素进行运算,将结果入栈。
4. 遍历完成后,将栈中剩余的元素进行运算,得到最终结果。
示例代码如下:
```python
def calculate(s):
stack = []
num = 0
sign = "+"
for i in range(len(s)):
if s[i].isdigit():
num = num * 10 + int(s[i])
if s[i] in "+-*/" or i == len(s) - 1:
if sign == "+":
stack.append(num)
elif sign == "-":
stack.append(-num)
elif sign == "*":
stack.append(stack.pop() * num)
elif sign == "/":
stack.append(int(stack.pop() / num))
num = 0
sign = s[i]
if s[i] == "(":
stack.append(sign)
sign = "+"
if s[i] == ")":
if sign == "+":
stack.append(num)
elif sign == "-":
stack.append(-num)
num = 0
while isinstance(stack[-1], int):
num += stack.pop()
if stack[-1] == "+":
stack.pop()
stack.append(num)
elif stack[-1] == "-":
stack.pop()
stack.append(-num)
break
return sum(stack)
```
测试代码:
```python
s = "(1+(2+3)*4)-5"
print(calculate(s)) # 输出:16
s = "2*(1+3)"
print(calculate(s)) # 输出:8
```
注意:此方法只适用于字符串中只包含数字、加减乘除和括号的情况,如果有其他字符或者不合法的运算式,程序会报错或者得到错误的结果。