7-1简单计算器pta
时间: 2025-06-30 18:36:30 浏览: 2
### PTA 7-1 简单计算器题目解析
对于PTA平台上编号为7-1的简单计算器题目,其核心在于理解如何通过堆栈来实现基本算术表达式的求解过程。此题要求构建一个基于两个堆栈的操作模型:`S1`用于存储数字,而`S2`则负责保存运算符。
当用户点击等于按钮时,程序会依次从`S1`中取出顶部两元素作为操作数n1和n2,并从`S2`获取相应的运算符op来进行计算。完成一次完整的四则运算之后,所得结果会被重新推入至`S1`等待后续可能存在的进一步处理直至所有待处理的数据都被消耗完毕[^1]。
为了更好地理解和解决这个问题,在实际编码过程中可以考虑采用如下策略:
#### 设计思路
定义两个列表分别模拟上述提到的两个堆栈行为。每当遇到一个新的数值或者运算符号时,依据具体情况进行压栈或弹栈动作。特别需要注意的是加减乘除四种不同类型的运算逻辑以及优先级控制机制的设计。
#### 关键点分析
- **输入处理**:读取并解析给定字符串形式的数学表达式。
- **运算符管理**:维护当前可用的一组基础二元运算符集合及其相对应的功能实现方式。
- **异常情况应对**:考虑到可能出现的各种边界条件比如非法字符、不匹配括号等问题。
```python
def calculate(expression):
operators = {'+', '-', '*', '/'} # 定义支持的运算符集
s1, s2 = [], [] # 初始化两个空栈s1(存数字), s2(存运算符)
i = 0
while i < len(expression): # 遍历整个表达式串
char = expression[i]
if '0' <= char <= '9': # 如果是数字,则继续向后扫描直到非数字为止
num_str = ''
while i < len(expression) and ('0' <= expression[i] <= '9'):
num_str += expression[i]
i += 1
s1.append(int(num_str)) # 把组成的整数加入到s1中
elif char in operators: # 若碰到运算符,则将其放入s2之前先做必要的运算简化工作
while (len(s2)>0 and precedence(char)<=precedence(s2[-1])):
do_operation(s1,s2)
s2.append(char)
else:
raise ValueError(f"Unexpected character {char}") # 对于其他任何未知字符抛出错误
i+=1 # 更新索引指针位置准备下一轮循环
while(len(s2)!=0): # 处理剩余未参与过运算的部分
do_operation(s1,s2)
def do_operation(nums_stack, ops_stack):
"""辅助函数用来执行具体的双目运算"""
b,a=nums_stack.pop(), nums_stack.pop()
op = ops_stack.pop()
result=None
match(op):
case '+':
result=a+b
case '-':
result=a-b
case '*':
result=a*b
case '/':
result=a/b
nums_stack.append(result)
def precedence(operator_char):
"""返回指定运算符对应的权重等级以便决定何时应该提前计算"""
levels={'*':3,'/':3,'+':2,'-':2}
return levels.get(operator_char,-1)
if __name__=="__main__":
expr="3+5*2"
calculate(expr)
```
这段Python代码展示了如何按照描述的要求去搭建这样一个简易版的逆波兰表示法(RPN)风格的计算器框架。当然这只是一个非常基础的例子,针对更复杂的场景还需要增加更多的特性支持如浮点数识别、负数处理等。
阅读全文
相关推荐


















