【java】多项式计算(中缀转后缀)
来源:互联网 发布:飞鱼网络电视版本介绍 编辑:程序博客网 时间:2024/05/16 17:24
Calculator.java:
package calculator;import java.util.Stack;public class Calculator { /** * 转为后缀 * @param exper 中缀表达式 * @return * @throws Exception */ public String postfixExpression(String exper) throws Exception { String exper_h = ""; Stack<Character> symbol = new Stack<>(); for (int i = 0; i < exper.length(); i++) { if (exper.charAt(i) >= '0' && exper.charAt(i) <= '9' || exper.charAt(i) == '.') {// 数字 exper_h += exper.charAt(i); } else {// 符号 exper_h += " "; if (exper.charAt(i) == '(') { symbol.push(exper.charAt(i)); continue; } if (exper.charAt(i) == ')') { while (!symbol.empty() && symbol.peek() != '(') exper_h += symbol.pop(); } else while (!symbol.empty() && priority(symbol.peek()) >= priority(exper.charAt(i))) { exper_h += symbol.pop(); } symbol.push(exper.charAt(i)); } } while (!symbol.empty()) { exper_h += symbol.pop(); } exper_h = exper_h.replace("(", "").replace(")", "").replaceAll(" +", " "); return exper_h; } /** * 计算结果 * @param exper_h 后缀表达式 * @return * @throws Exception */ public Float calculation(String exper_h) throws Exception { Stack<String> number = new Stack<>(); String temp = ""; for (int i = 0; i < exper_h.length(); i++) { if (exper_h.charAt(i) >= '0' && exper_h.charAt(i) <= '9' || exper_h.charAt(i) == '.' || exper_h.charAt(i) == ' ') { temp += exper_h.charAt(i); if (exper_h.charAt(i + 1) == ' ') { number.push(temp); temp = ""; i++; } else if (isSymbol(exper_h.charAt(i + 1))) { number.push(temp); temp = ""; } } else { float val1 = Float.valueOf(number.pop()); float val2 = Float.valueOf(number.pop()); number.push(col(val2, val1, exper_h.charAt(i)).toString()); } } return Float.valueOf(number.pop()); } /** * 优先级 * * @param c * @return * @throws Exception */ public int priority(char c) throws Exception { if (c == '(' || c == ')') return -1; if (c == '*' || c == '/') return 2; else if (c == '+' || c == '-') return 1; else if (c == ' ') { return 0; } else throw new Exception(); } /** * 计算 * @param val1 * @param val2 * @param c * @return * @throws Exception */ public Float col(Float val1, Float val2, char c) throws Exception { if (c == '*') { return val1 * val2; } else if (c == '/') { return val1 / val2; } else if (c == '+') { return val1 + val2; } else if (c == '-') { return val1 - val2; } else throw new Exception(); } /** * 符号检查 * @param c * @return */ public boolean isSymbol(char c) { return c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')'; }}
Main:
package calculator;import java.util.Stack;public class Main { public static void main(String[] args) throws Exception { String exper = "1+1-(1*2+3-4/2)-1"; Calculator ca =new Calculator(); String exper_h = ca.postfixExpression(exper); System.out.println(ca.calculation(exper_h))```//输出:0.0 }}
阅读全文
0 0
- 【java】多项式计算(中缀转后缀)
- java实现中缀转后缀,后缀计算值
- Java 中缀表达式转后缀表达式 + 中/后缀表达式计算
- 中缀表达式转后缀表达式 (中缀表达式的计算)
- 数据结构与算法分析 c++11 练习3.22 中缀表达式转后缀表达式,后缀表达式计算, 多项式计算
- fzu2215 中缀表达式展开求多项式系数(模拟)【中缀转后缀模板】
- Java 中缀转后缀
- 中缀转后缀并计算
- 栈-中缀转后缀及后缀计算
- java实现中缀表达式转后缀表达式并且计算
- Java实现中缀表达式转后缀表达式并计算结果
- java 中缀转后缀(逆波兰)
- java 中缀转后缀(逆波兰)
- 栈应用之中缀转后缀表达式计算(C++、JAVA)
- 表达式计算(中缀表达式转后缀前缀表达式)
- hdu 1237(中缀表达式转后缀并计算)
- 中缀表达式转后缀表达式并计算(十位以内)
- 表达式计算(中缀转后缀,然后求值)
- HDU 6055 推公式
- CharacterController控制人物的移动
- ionic+上拉刷新,下拉加载
- 飞秋软件看不到好友
- 【51Nod1412】AVL树的种类
- 【java】多项式计算(中缀转后缀)
- CTF/CTF练习平台-各种绕过哟【sha1数组类型比较漏洞】
- 最全Pycharm教程(35)——Pycharm中使用Vagrant
- MacOS 开发
- 关于高级类特性修饰符、类间关系,API概念浅析
- HDU 6050 推公式
- spring-status-hibernate
- Struts2(9)——struts2与OGNL的结合(二)
- 测试之黑盒测试用例设计方法(等价类划分法)