目标:
实现一个简易的公式计算器,如根据用户输入 2+4*3-2-(2*8) 公式可以自行求解
实现思路:
概念:
中缀式:如2+4*3-2-(2*8)
后缀式:如上中缀式转换为后缀式为
1. 公式转换,解决公式开头为负数的问题。
1. 将中缀式转换为后缀式并放入后缀栈中
1. 将后缀栈中的数据弹出计算并放入结果栈中
逆波兰(中缀转后缀式)总结:
从左往右依次处理
遇见数字直接追加写入公式中,如果遇见的是运算符。
2.1 遇见的运算符与栈顶中的运算符进行优先级对比,如栈中不存在运算符则直接放入栈中,优先级小于等于栈顶运算符时循环取出栈顶运算符追加入公式中,最后将当前运算符放入栈中。优先级大于栈顶运算符时直接放入栈中。
2.2 遇见的运算符为)时,依次弹出栈顶运算符并追加入公式中,直至栈顶的运算符为(时为止。
代码核心组件逻辑图
- 公式计算器
- 解析器(逆波兰/后缀表达式)
- 后缀式栈
- 运算符号栈
- 计算栈
- 函数集
- 常用的数学函数
- 加
- 减
- 乘
- 除
代码实现
1 | package com.spidermen.math; |
1 | package com.spidermen.math; |