分析

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

没有考虑括号、小数。

代码

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. [解读REST] 0.REST 相关参考资料

    Web之父 Tim Berners Lee :https://en.wikipedia.org/wiki/Tim_Berners-Lee 世界上诞生的第一个网站:http://info.cern.ch ...

  2. 缓存淘汰算法之LFU

    1. LFU类 1.1. LFU 1.1.1. 原理 LFU(Least Frequently Used)算法根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频 ...

  3. rsa Round #71 (Div. 2 only)

    Replace A Time limit: 1000 msMemory limit: 256 MB   You are given a string SS containing only letter ...

  4. 九度oj 题目1079:手机键盘

    题目描述: 按照手机键盘输入字母的方式,计算所花费的时间 如:a,b,c都在“1”键上,输入a只需要按一次,输入c需要连续按三次. 如果连续两个字符不在同一个按键上,则可直接按,如:ad需要按两下,k ...

  5. Android中当前墙纸Wallpaper存放的位置

    最近想做个应用保存当前墙纸,找了一下,发现当前墙纸的位置在. /System/users/0/wallpaper 没有后缀.导出来修改一下名字就可以看到图标了.比如改为png. 但是,这个目录要求系统 ...

  6. Jersey实现Client端:GET/PUT/POST/DELETE

    原文地址:Jersey客户端API调用REST风格的Web服务 [节选] 要开始使用 Jersey 客户端 API,你首先需要创建一个 com.sun.jersey .api.client.Clien ...

  7. CentOS7 修改时区、charset

    1. 修改时区 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 经过这番修改后,JAVA启动后自动使用了Shanghai作为时区. 2. ...

  8. java面试题之数据基本类型各占几个字节

    类型 位数 字节数 short 2*8 2 char 2*8 2 int 4*8 4 float 4*8 4 long 8*8 8 double 8*8 8

  9. git统计日期之间的代码改动行数

    git log --pretty=tformat: --since ==2016-10-25 --until=2016-10-27   --numstat | awk '{ add += $1 ; s ...

  10. 推荐个PMP的内容,广州有需要的朋友可以参考看看

    慧翔天地PMP®培训机构简介 广州慧翔企业管理咨询有限公司注册于2012年8月14日,注册资金200万元人民币.实际上从2011年就已经开始从事PMP推广及教学工作(2010年曾代理智鼎东方华南市场, ...