利用栈Stack计算合法的算术表达式

限定的算术表达式求值问题:包含  “+”、“-”、“*”、“/”  、正整数和圆括号的合法算术表达式。

算术表达式转化成后缀表达式

程序语言中,运算符在两个运算数中间称为中缀表达式,即我们常用的表达方法,例如 1+2*3。

在中缀表达式中要考虑运算的优先级,先乘除,后加减,从左到右,还有括号内先运算。

在后缀表达式中已经考虑了运算符的优先级,并且没有括号,只有运算数和运算符。

例如上述例子 1+2*3 ,中缀表达式计算时,根据优先级,先计算2*3=6,再计算1+6=7

转换成后缀表达式   1+2*3 => 123*+ ,

从左到右扫描第一个运算符为 * ,先执行2*3;第二个运算符为 + ,执行1+6.

中缀表达式转后缀表达式过程

①初始化exp字符数组、resultExp字符数组(可变)、operator栈

exp字符数组:存放,合法的算术表达式

resultExp字符数组(可变):存放后缀表达式

operator栈:存放运算符,并将 “=” 作为栈底元素

②从exp读取字符ch,若为运算数将后续运算数依次存放入resultExp中,并以#标志数值结束

③若ch为运算符,将其和operator栈顶中的运算符进行比较优先级比较

ch优先级大于栈顶运算符优先级,则ch进栈

ch优先级小于栈顶运算符优先级,则栈中运算符退栈,直至ch运算符大于栈顶运算符,ch再进栈。

ch优先级等于栈顶运算符优先级,特殊情况,只有括号满足该情况,即“)”的优先级 等于“(”的优先级,将(退栈。

④exp扫描完毕,此时operator栈不空,则将 “=” 之前所有的运算符退栈并放入resultExp中

复杂一点的例子

(12-3)/(4+5)

算法如下:

packagecom.xumz.stack;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.Stack;/*** 中缀表达式转后缀表达式

*

*@authorxumz 2017/10/18*/

public classExpressionChange {//存放左运算符的优先级

Map leftOperator = new HashMap() {

{

put('=', 0);

put('(', 1);

put('+', 3);

put('-', 3);

put('*', 5);

put('/', 5);

put(')', 6);

}

};//存放右运算符的优先级

Map rightOperator = new HashMap() {

{

put('=', 0);

put('(', 6);

put('+', 2);

put('-', 2);

put('*', 4);

put('/', 4);

put(')', 1);

}

};/*** 中缀转后缀

*

*@paramstr

*@return

*/

publicString trans(String str) {//转换成char[]

char[] exp =str.toCharArray();//存放转换结果

List resultExp = new ArrayList();//存放运算符,初始底为‘=’

Stack operator = new Stack();

operator.push('=');//扫描exp表达式

int i = 0;while (i !=exp.length) {//数字情况

if (!isOperator(exp[i])) {while (i != exp.length && !isOperator(exp[i])) {

resultExp.add(exp[i]);

i++;

}

resultExp.add('#');

}//运算符情况

else{switch(compareOperatorNice(operator.peek(), exp[i])) {case -1:

operator.push(exp[i]);

i++;//继续下一个字符

break;case 0:

operator.pop();

i++;//继续下一个字符

break;case 1:

resultExp.add(operator.peek());

operator.pop();break;

}

}

}while (!(operator.peek()=='=')) {

resultExp.add(operator.peek());

operator.pop();

}//转换为String返回

returnresultExp.toString();

}boolean isOperator(charch) {if(leftOperator.containsKey(ch)) {return true;

}return false;

}/*** 比较左右运算符优先级,返回状态结果

*

*@paramleftOperator

*@paramrightOperator

*@return

*/

int compareOperatorNice(char left, charright) {if (leftOperator.get(left) ==rightOperator.get(right)) {return 0;

}if (leftOperator.get(left)

}return 1;

}

}

View Code

java利用栈求复杂表达式_java中的栈Stack的基本使用和应用(二) ——利用栈计算合法的算术表达,中缀表达式转后缀表达式...相关推荐

  1. java求最值_java中六种求最值的方式

    第一种:通过 Collections 求最值 import java.util.Arrays; import java.util.Collections; public class Demo { pu ...

  2. java list 去重 相同的相加_Java 中的数据流和函数式编程 | Linux 中国

    学习如何使用 Java 8 中的流 API 和函数式编程结构.-- Marty Kalin 当 Java SE 8(又名核心 Java 8)在 2014 年被推出时,它引入了一些更改,从根本上影响了用 ...

  3. java 怎么把list流化_Java 中的数据流和函数式编程

    原标题:Java 中的数据流和函数式编程 学习如何使用 Java 8 中的流 API 和函数式编程结构.-- Marty Kalin(作者) 当 Java SE 8(又名核心 Java 8)在 201 ...

  4. 用java语编写求素数程序_java求素数代码

    public static void main(String args[]) { int i,n,flag; { 1.程序分析:判断素数的方法:用一个数分别去除 2 到 sqrt(这个数),如果能被整 ...

  5. java map怎么判断为空_java中如何判断map是否为空

    java中判断map是否为空的方法是:利用isEmpty()函数来判断. (推荐学习:java入门程序) 函数介绍: IsEmpty()是Java中用于判断某种容器是否有元素的系统库函数.如用来判断A ...

  6. java线程和进程的区别_Java中的线程和进程比较

    1.进程和线程的区别 通俗一点说,进程就是程序的一次执行,而线程可以理解为进程中的执行的一段程序片段. 用一点文词说就是,每个进程都有独立的代码和数据空间(进程上下文);而线程可以看成是轻量级的进程. ...

  7. java单个变量的表达式_java中使用Lambda表达式的5种语法

    1,标准写法 思考下述情况: String[] arr = {"program", "creek", "is", "a" ...

  8. lambda java 表达式_Java中的Lambda表达式

    介绍 Lambda函数是 Java 8 附带的一项功能,它是该语言向 函数式编程 迈出的第一步,这是实现各种兼容 范例的 有用功能的普遍趋势. 引入lambda函数的动机主要是为了减少传递给类实例以模 ...

  9. java如何实现e的次方_Java中怎样怎样算出求函数的幂次方?

    展开全部 java中通常进行数学运算的东西都在Math类中,求函数的幂次方就是Math类中的pow方法:public static double pow(double a, double b), 返回 ...

最新文章

  1. AndroidSDK结合SpringBoot实现支付宝支付功能
  2. Vue 中定义方法页面上使用
  3. UML之交互图(协作图和顺序图)
  4. ajax: PopupControlExtender使用
  5. 王小云:连破两套美国顶级密码,获得711万奖励,美国不淡定了
  6. php中动态变量数组,php – 将数组提取到动态变量中
  7. 【免费毕设】ASP.NET电子购物商城系统(源代码+lunwen)
  8. 中文命名实体识别,HMM,CRF,BiLSTM,BiLSTM+CRF的具体实现
  9. Ugly Number II
  10. python django项目管理系统_python3+django2开发一个简单的人员管理系统
  11. pdf reference官方指南之-语法基础和文件结构
  12. python贪吃蛇游戏设计答辩_python编写贪吃蛇游戏
  13. 利用自己的祖源成分结果画祖源成分饼图
  14. LaTeX常用符号(持续更新)
  15. Selenium无法定位的6种解决方案
  16. JS 中提交表单Form方法
  17. 局域网内台式机使用笔记本作代理服务器上网
  18. 典故:一文钱难倒英雄汉
  19. 微服务项目架构演变过程
  20. mac服务器文件夹权限设置密码,如何在Mac os优胜美地给文件和文件夹加密

热门文章

  1. RISC-V CTO: 我们不会像 Arm 和 x86 那样左右芯片的设计
  2. 预见——数据技术的未来生态
  3. 高性能 Go 日志库 zap 设计与实现
  4. 0基础如何系统的学习Python? 只要完成这 9 步
  5. Nutanix推出云基础架构远程管理IT解决方案
  6. 小米崔宝秋:一家互联网公司没有信息安全团队,就像在“裸奔”!
  7. 1秒替换视频背景,阿里AI获CVPR 2020四项世界冠军
  8. 5 万人在家办公,如何高效协同?字节跳动提供了一份指南
  9. 世界最前沿黑科技实验室 MIT Media Lab 教授 Cynthia: 让社交机器人陪伴千万家庭成为现实...
  10. Python 爬取 6271 家死亡公司数据,一眼看尽十年创业公司消亡史!