python计算字符串 “9*7+12-5” 的计算结果,不使用模块,不使用eval函数,使用不同的方法
时间: 2024-02-28 12:53:21 浏览: 53
小白IT:python的函数&内置方法&常用的模块详解-方法-使用-坚持就是胜利
可以使用栈来计算表达式的值。具体步骤如下:
1. 将表达式字符串转换为后缀表达式(也叫逆波兰表达式),可以使用栈来实现。
2. 计算后缀表达式的值,同样可以使用栈来实现。
下面是具体的实现代码:
```python
# 定义运算符的优先级
priority = {'+': 1, '-': 1, '*': 2, '/': 2}
# 将中缀表达式转换为后缀表达式
def infix_to_postfix(s):
postfix = [] # 存储后缀表达式
stack = [] # 存储运算符的栈
for c in s:
if c.isdigit(): # 如果是数字,直接加入后缀表达式
postfix.append(c)
elif c in priority: # 如果是运算符
# 将栈中优先级大于等于该运算符的运算符弹出并加入后缀表达式
while stack and priority.get(stack[-1], 0) >= priority[c]:
postfix.append(stack.pop())
stack.append(c) # 将该运算符加入栈中
elif c == '(': # 如果是左括号,直接加入栈中
stack.append(c)
elif c == ')': # 如果是右括号,将栈中的运算符弹出并加入后缀表达式,直到遇到左括号
while stack and stack[-1] != '(':
postfix.append(stack.pop())
stack.pop() # 弹出左括号
# 将栈中剩余的运算符弹出并加入后缀表达式
while stack:
postfix.append(stack.pop())
return postfix
# 计算后缀表达式的值
def evaluate_postfix(postfix):
stack = [] # 存储操作数的栈
for c in postfix:
if c.isdigit(): # 如果是数字,将其转换为整数并加入栈中
stack.append(int(c))
else: # 如果是运算符,弹出栈顶的两个操作数进行计算,并将结果加入栈中
b = stack.pop()
a = stack.pop()
if c == '+':
stack.append(a + b)
elif c == '-':
stack.append(a - b)
elif c == '*':
stack.append(a * b)
elif c == '/':
stack.append(a // b)
return stack.pop()
# 测试
s = '9*7+12-5'
postfix = infix_to_postfix(s)
result = evaluate_postfix(postfix)
print(result) # 输出:70
```
这里使用了两个栈,一个用来转换中缀表达式为后缀表达式,另一个用来计算后缀表达式的值。中缀表达式转换为后缀表达式的过程中,遇到数字直接加入后缀表达式,遇到运算符则将栈中优先级大于等于该运算符的运算符弹出并加入后缀表达式,最后将该运算符加入栈中。遇到左括号直接加入栈中,遇到右括号将栈中的运算符弹出并加入后缀表达式,直到遇到左括号。计算后缀表达式的值时,遇到数字直接加入操作数栈中,遇到运算符则弹出栈顶的两个操作数进行计算,并将结果加入栈中。最后操作数栈中只剩下一个元素,即为表达式的值。
阅读全文