尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

双栈法实现计算器:原理与代码详解

双栈法实现计算器:原理与代码详解 1. 计算器实现的基本思路作为一个从零开始的计算器项目我们需要先明确核心功能边界。现代计算器通常包含以下基础能力四则运算加、减、乘、除括号优先级处理浮点数运算连续运算如35×2错误处理如除零错误实现路径主要有两种表达式解析法将输入字符串转换为抽象语法树AST后递归计算双栈法使用操作数栈和运算符栈实时处理运算顺序我推荐采用双栈法因为它的时间复杂度稳定在O(n)且更贴近计算器的实时交互特性。下面通过具体代码示例演示实现过程。2. 核心数据结构设计2.1 运算符优先级映射表precedence { : 1, -: 1, *: 2, /: 2, ^: 3 # 扩展指数运算 }2.2 双栈初始化operand_stack [] # 操作数栈 operator_stack [] # 运算符栈关键细节运算符栈需要预设一个最低优先级的哨兵元素如#避免空栈判断3. 表达式解析流程3.1 词法分析将输入字符串3.5*(4-1)拆分为 [3.5, *, (, 4, -, 1, )]3.2 处理流程伪代码for token in tokens: if token是数字: 压入operand_stack elif token是(: 压入operator_stack elif token是): 弹出运算符直到遇到( else: while 栈顶运算符优先级≥当前token: 执行栈顶运算 压入当前token4. 运算执行细节4.1 二元运算实现def apply_operator(op, a, b): if op : return a b elif op -: return a - b elif op *: return a * b elif op /: if b 0: raise ValueError(除零错误) return a / b4.2 栈操作示例处理35*2时遇到*时因优先级高于暂不计算完成整个表达式扫描后从右向左计算5. 边界情况处理5.1 非法输入检测括号不匹配连续运算符如34小数点错误如3.14.155.2 特殊运算规则负号处理区分减号与负号整数除法与浮点除法大数溢出处理6. 界面交互实现6.1 控制台版本while True: expr input(输入表达式(q退出): ) if expr q: break try: print(f结果: {evaluate(expr)}) except Exception as e: print(f错误: {str(e)})6.2 GUI版本关键组件按钮矩阵布局实时显示框历史记录功能7. 测试用例设计7.1 基础运算验证assert calculate(23*4) 14 assert abs(calculate(1/3) - 0.333) 0.0017.2 异常场景测试with pytest.raises(ValueError): calculate(1/0)8. 性能优化方向8.1 内存优化使用固定大小数组替代栈预分配token缓冲区8.2 计算加速预编译常用表达式引入JIT编译技术我在实际开发中发现使用Numba加速后复杂表达式的计算速度可提升5-8倍。对于科学计算场景建议扩展math模块的函数支持。
返回列表