分析

首先将中缀表达式转换为后缀表达式(逆波兰式),然后使用栈进行计算。

没有考虑括号、小数。

代码

import java.util.LinkedList;
import java.util.List;
import java.util.Stack; public class ExpCal {
public static double calc(String exp) {
if (exp == null || exp.length() <= 0) {
throw new IllegalArgumentException();
} char[] c = exp.toCharArray();
Stack<Character> s = new Stack<Character>();
List<String> reversePolishNotation = new LinkedList<String>();
for (int i = 0; i < c.length; ++i) {
if (c[i] == '+' || c[i] == '-' || c[i] == '*' || c[i] == '/') {
while (!s.isEmpty() && compOp(s.peek(), c[i]) >= 0) {
reversePolishNotation.add(String.valueOf(s.pop()));
}
s.push(c[i]);
} else {
StringBuilder sb = new StringBuilder();
while (i < c.length && c[i] >= '0' && c[i] <= '9') {
sb.append(c[i++]);
}
reversePolishNotation.add(sb.toString());
--i;
}
}
while (!s.isEmpty()) {
reversePolishNotation.add(String.valueOf(s.pop()));
} Stack<Double> num = new Stack<Double>();
for (String e : reversePolishNotation) {
if (e.equals("+")) {
num.push(num.pop() + num.pop());
} else if (e.equals("-")) {
double a = num.pop();
double b = num.pop();
num.push(b - a);
} else if (e.equals("*")) {
num.push(num.pop() * num.pop());
} else if (e.equals("/")) {
double a = num.pop();
double b = num.pop();
num.push(b / a);
} else {
num.push(Double.parseDouble(e));
}
} return num.pop();
} private static int compOp(char a, char b) {
return getPri(a) - getPri(b);
} private static int getPri(char c) {
switch (c) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
} public static void main(String[] args) {
System.out.println(calc("4*3+2*5-8/8-2*6/3+2/1-4"));
}
}

IDG | 四则运算表达式计算的更多相关文章

  1. sql server编写简洁四则运算表达式脚本实现计算批次功能(C#等其它编程语言也能直接用此通用表达式)

    问题: 在数据库编程开发中,有时会遇到数据量比较大的情况,如果直接大批量进行添加数据.修改数据.删除数据,就会是比较大的事务,事务日志也比较大,耗时久的话会对正常操作造成一定的阻塞.虽不至于达到删库跑 ...

  2. WUSTOJ 1208: 计算整数四则运算表达式的结果(Java)

    1208: 计算整数四则运算表达式的结果 参考资料 数据结构(C语言版)严蔚敏 吴伟民 编著----表达式求值 题目   简单四则运算.更多内容点击标题. 保证表达式合法. 运算符只包含:加(+),减 ...

  3. 数据结构课程设计四则运算表达式求值(C语言版)

    本系统为四则运算表达式求值系统,用于带小括号的一定范围内正负数的四则运算标准(中缀)表达式的求值.注意事项:    1.请保证输入的四则表达式的合法性.输入的中缀表达式中只能含有英文符号"+ ...

  4. .NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Expression Evaluator验证组件.那里只是概述了一下,并没有对其使用和强大功能做 ...

  5. C# - 二叉树表达式计算

    很早以前就写过双栈的表达式计算. 这次因为想深入学一下二叉树,网上都是些老掉牙的关于二叉树的基本操作. 感觉如果就学那些概念,没意思也不好记忆.于是动手写了一个表达式计算的应用例子. 这样学习印象才深 ...

  6. C#动态表达式计算

    C#动态表达式计算 应该有不少人开发过程中遇到过这样的需求,我们直接看图说话: 如上图所示,其中Entity为实体类,其中包括五个属性,该五个属性的值分别来自于数据库查询结果: 用户通过可视化界面进行 ...

  7. C#动态表达式计算(续2)

    上两篇废话太多,这一次我就不多说了,由于代码比较简单,可以直接从https://github.com/scottshare/DynamicExpress.git地址下载. 以下说明一下使用方法: Dy ...

  8. 栈应用之 后缀表达式计算 (python 版)

    栈应用之 后缀表达式计算 (python 版) 后缀表达式特别适合计算机处理 1.  中缀表达式.前缀表达式.后缀表达式区别  中缀表达式:(3 - 5) * (6 + 17 * 4) / 3 17 ...

  9. C++实现 逆波兰表达式计算问题

    C++实现 逆波兰表达式计算问题 #include <iostream> #include <string> using namespace std; class Stack ...

随机推荐

  1. 光学字符识别OCR-8 综合评估

    数据验证 尽管在测试环境下模型工作良好,但是实践是检验真理的唯一标准.在本节中,我们通过自己的模型,与京东的测试数据进行比较验证.         衡量OCR系统的好坏有两部分内容:(1)是否成功地圈 ...

  2. [uiautomator篇][python调用java][1]应用下载的插件需要很长时间问题解决

    1第一次打开应用,可能会要求下载插件,我们先在/sdcard/Android/data/<packageName>  或者/data/data/<pakeageName>找到插 ...

  3. PHPSTORM+Thinkphp3.2模板标签替换Thinkphp5.1公式

    FORMAT: purpose: find: replace 替换<php>标签 <php>(.*)</php> {php}$1{/php} 替换<if &g ...

  4. Hibernate的简单封装Session(方便调用)

    因为每次用增删改查时都需要用到hibernate的配置来生成session工厂进而生成session,比较麻烦,所以我们直接封装一个可以调用的类,需要的时候只需要调用即可. 新建一个Hibernate ...

  5. 设计模式(十六)迭代器模式 Iterator

    什么时候需要用到迭代器模式? 有许多中方法,可以把对象堆起来放进一个集合(可以是数组.堆栈.列表.哈希表,等等). 每一种类型的集合,都有各自适用的时机.但是某个时间段,客户端可能希望去遍历这个集合. ...

  6. 微软2014实习生及秋令营技术类职位在线测试(题目1 : String reorder)

    题目1 : String reorder 时间限制:10000ms 单点时限:1000ms 内存限制:256MB Description For this question, your program ...

  7. BZOJ1189 [HNOI2007]紧急疏散evacuate 【二分 + 网络流】

    题目 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一 块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一扇门,人们可以从 ...

  8. 网抓(XML Http Request、VBA)实现

    第一种,先看VBA Public Function GetInfo(strMoblie As String) As String '创建对象 Dim xmlHttp As Object Set xml ...

  9. java面试题之final、finalize和finally的区别

    finally:finally是一个关键字,与try和catch一起用于异常的处理,finally块一定会执行,无论在try快中是否有发生异常. finalize:finalize方法是在对象被回收之 ...

  10. Blog 081018

    对于 linux 系统 api, 尝试理解函数参数和函数之间的内在联系,为什么要用这些参数而不是另一些参数,了解 api 之间的一些共性. 一个扩展性良好的程序,结构都有一些共性,就像是一个国家,有好 ...