当前位置: 首页 > news >正文

表达式求值(可以计算两位数以上)

此程序可计算两位数以上的表达式


import java.util.Stack;public class ExpressionEvaluator {public int evaluate(String s) {Stack<Integer> numbers = new Stack<>();Stack<Character> operators = new Stack<>();int i = 0;char c = s.charAt(i);while (c==' '){i++;c = s.charAt(i);}if (!In(c)) {int d = c -'0';i++;while (i<s.length()&&!In(s.charAt(i))&&s.charAt(i)!=' '){d=d*10+(s.charAt(i)-'0');i++;}numbers.push(d);} else {operators.push(c);i++;}while ( i != s.length()) {c = s.charAt(i);if(c == ' '){i++;continue;}if (!In(c)) {int d = c -'0';i++;while (i<s.length()&&!In(s.charAt(i))&&s.charAt(i)!=' '){d=d*10+(s.charAt(i)-'0');i++;}numbers.push(d);} else if (operators.isEmpty()) {operators.push(c);i++;} else {switch (Precede(operators.peek(), c)) {case '<':operators.push(c);i++;break;case '>':char theta = operators.pop();int a = numbers.pop();int b = numbers.pop();numbers.push(evalSingleOp(b, a, theta));break;case '=':operators.pop();i++;break;}}}while (!operators.isEmpty()){char theta = operators.pop();int a = numbers.pop();int b = numbers.pop();numbers.push(evalSingleOp(b, a, theta));}return numbers.pop();}public char Precede(char a, char b) {//判断操作符的优先级switch (a) {//先算最厉害的case '+':case '-':if ((b == '*') || (b == '/') || (b == '('))return '<';elsereturn '>';case '/':case '*':if (b == '(')return '<';elsereturn '>';case '(':if (b == ')')return '=';elsereturn '<';case ')':return '>';default:throw new RuntimeException("运算符优先级错误");}}public boolean In(char ch) {//判断是操作数还是操作符int i;char[] p = new char[]{'+', '-', '*', '/', '(', ')'};for (i = 0; i < 6; i++)if (ch == p[i]) return true;return false;}private int evalSingleOp(int a, int b, char op) {//计算表达式switch (op) {case '+':return a + b;case '-':return a - b;case '*':return a * b;case '/':return a / b;default:throw new IllegalStateException("Unexpected operator: " + op);}}public static void main(String[] args) {ExpressionEvaluator evaluator = new ExpressionEvaluator();System.out.println("(1+3)*((2+5)-4)*2="+evaluator.evaluate("(1+3)*((2+5)-4)*2"));System.out.println("1+3*2+5-4*2="+evaluator.evaluate("1+3*2+5-4*2"));System.out.println("100*2*3="+evaluator.evaluate("100*2*3"));}
}

结果如图


http://www.mrgr.cn/news/43341.html

相关文章:

  • 【云原生】云原生架构的反模式
  • dll动态库加载失败导致程序启动报错以及dll库加载失败的常见原因分析与总结
  • 今日指数项目个股描述功能实现
  • 弧形导轨驱动器高效使用技巧!
  • 双十一狂欢派对 五款市面上获得好评的好物
  • 【深度学习】— softmax回归、网络架构、softmax 运算、小批量样本的向量化、交叉熵
  • 实现 Spring IOC 的关键问题和技术详解
  • 基于SpringBoot+Vue的高校运动会管理系统
  • X3U·可编程控制器的定位控制
  • 文心智能体——制作你的专属AI
  • 如何让猫咪长肉?瘦猫增重猫罐测评:fellicita、希喂、wellness好不好?
  • Python环境安装教程
  • Linux线程(七)线程安全详解
  • hdfs伪分布式集群搭建
  • 打卡第一天 B2005 字符三角形
  • k8s 之动态创建pv失败(踩坑)
  • 【复习】HTML常用标签<table>
  • 使用DS18B20温度传感器读取温度,附STM32代码示例
  • VBA信息获取与处理第三个专题第三节:工作薄在空闲后自动关闭
  • Kafka 快速入门