1. /*将中缀表达式--转化为后缀表达式--属于栈的一种应用
  2. *具体思路:
  3. *1.扫描字符串,遇到操作数字符直接不管,存到一个字符串里边
  4. *2.操作符优先级比较--定义了方法
  5. * 栈中优先级高:出栈存进字符串,当前的操作符进栈
  6. * 当前操作符优先级高,直接进栈
  7. * 对于左边括号直接进栈,右边括号涉及栈中出栈
  8. *3.扫描完了在将栈中的出栈和操作数存储在一起
  9. *转化完直观的表现:操作数相对位置不变,操作符相对位置相反
  10. * */
  11. public class IntoSuffixExpression {
  12. private CharStack stack;
  13. private String input;
  14. private String output = "";
  15.  
  16. public IntoSuffixExpression(String in) {
  17. input = in;
  18. stack = new CharStack(input.length());
  19. }
  20.  
  21. //转化为后缀表达式
  22. public String doTrans(){
  23. for(int i = 0; i < input.length();i++){
  24. char ch = input.charAt(i);
  25. stack.displayStack("For " + ch + " ");
  26. /*分析读到的元素的类型--操作符/操作数(默认添加到输出字符串中)
  27. *对于操作符分类并进行优先级比较 乘除优先级高于加减*/
  28. switch(ch){
  29. case '+':
  30. case '-':
  31. gotOper(ch,1);//需要判断优先级prec1:设定的是当前的优先级
  32. break;
  33. case '*':
  34. case '/':
  35. gotOper(ch,2);//需要判断优先级
  36. break;
  37. case '(':
  38. stack.push(ch);//左括号优先级最高直接进栈
  39. break;
  40. case ')':
  41. gotParent(ch);//碰到右边括号涉及出栈
  42. break;
  43. default:
  44. output = output + ch;//是操作数就直接存在输出字符串中
  45. break;
  46. }
  47. }
  48. //打印战中的操作符返回后缀表达式字符串
  49. while(!stack.isEmpty()){
  50. stack.displayStack("while");
  51. output = output + stack.pop();
  52. }
  53. stack.displayStack("end");
  54. return output;
  55. }
  56.  
  57. //比较当前的操作符与栈里面的操作符优先级--进行不同的操作
  58. public void gotOper(char opThis, int prec1) {
  59. while(!stack.isEmpty()){
  60. char opTop = stack.pop();
  61. if(opTop == '('){ //如果栈中顶是左边括号就进去跳出循环
  62. stack.push(opTop);
  63. break;
  64. }
  65. else{
  66. int prec2;
  67. //记录栈中操作符优先级--加减优先级是1乘除优先级是2
  68. if(opTop == '+' || opTop == '-'){
  69. prec2 = 1;
  70. }
  71. else{
  72. prec2 = 2;
  73. }
  74. //栈中优先级小结束比较--当前执行进栈操作
  75. if(prec2 < prec1){
  76. stack.push(opTop);
  77. break;
  78. }
  79. //栈中优先级大就出栈存储在字符串中
  80. else{
  81. output = output + opTop;
  82. }
  83. }
  84. }
  85. //栈为空就直接进栈或者遇到左边括号也是直接进栈或者栈存储比栈中优先级小的
  86. stack.push(opThis);
  87. }
  88.  
  89. //越到右边括号进行出栈的操作--直到遇到左边括号
  90. public void gotParent(char ch){
  91. while(!stack.isEmpty()){
  92. char chx = stack.pop();
  93. if(chx == '('){
  94. break;
  95. }
  96. else{
  97. output = output + chx;
  98. }
  99. }
  100. }
  101.  
  102. }
  1. /*计算后缀表达式的值--也用的是栈
  2. * */
  3. public class CalculateSuffixExpression {
  4. private MyStack stack;
  5. private String input;
  6.  
  7. //注意这里传入的字符串是后缀的表达式
  8. public CalculateSuffixExpression(String in) {
  9. input = in;
  10. }
  11.  
  12. //数字进栈,操作符栈中元素出栈对应相应的操作
  13. public long calculateValue(){
  14. stack = new MyStack(20);
  15. char ch;
  16. int j;
  17. long num1,num2,interAns;
  18. for(j = 0;j < input.length();j++){
  19. ch = input.charAt(j);
  20. stack.displayStack("" + ch + "");
  21. if(ch >= '0' && ch <= '9'){ //操作数
  22. stack.push((long)(ch - '0'));
  23. }
  24. else{
  25. num2 = stack.pop();
  26. num1 = stack.pop();
  27. switch(ch){
  28. case'+':
  29. interAns = num1 + num2;
  30. break;
  31. case'-':
  32. interAns = num1 - num2;
  33. break;
  34. case'*':
  35. interAns = num1 * num2;
  36. break;
  37. case'/':
  38. interAns = num1 / num2;
  39. break;
  40. default:
  41. interAns = 0;
  42. }
  43. stack.push(interAns);
  44. }//end else
  45. }//end for
  46. interAns = stack.pop();
  47. return interAns;
  48. }//end method
  49.  
  50. public static void main(String[] args){
  51. //转化后缀表达式
  52. String s = "3+(6*9)+2-6/(3-1)";
  53. IntoSuffixExpression is = new IntoSuffixExpression(s);
  54. String out = is.doTrans();
  55.  
  56. //计算后缀表达式
  57. CalculateSuffixExpression cse = new CalculateSuffixExpression(out);
  58. long result = cse.calculateValue();
  59. System.out.println(result);
  60.  
  61. }
  62.  
  63. }

表达式求值--Java实现的更多相关文章

  1. 利用栈实现算术表达式求值(Java语言描述)

    利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...

  2. 逆波兰表达式求值 java实现代码

    根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...

  3. 表达式求值(java)

    今天去面试,考了这个,短时间没想出来... 太笨了! 后来想用栈和递归做 但是看了网上才知道,可以将中缀表达式转为后缀表达式,就极其方便了. import java.util.Scanner; imp ...

  4. 去空格的四则运算表达式求值-Java

    笔记 package com.daidai.day4.demo1; import java.util.ArrayList; import java.util.Arrays; import java.u ...

  5. leetcode算法学习----逆波兰表达式求值(后缀表达式)

    下面题目是LeetCode算法:逆波兰表达式求值(java实现) 逆波兰表达式即后缀表达式. 题目:  有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式.同 ...

  6. java实现算术表达式求值

    需要根据配置的表达式(例如:5+12*(3+5)/7.0)计算出相应的结果,因此使用java中的栈利用后缀表达式的方式实现该工具类. 后缀表达式就是将操作符放在操作数的后面展示的方式,例如:3+2 后 ...

  7. 奇怪的表达式求值 (java实现)

    题目参考:http://blog.csdn.net/fuxuemingzhu/article/details/68484749 问题描述; 题目描述: 常规的表达式求值,我们都会根据计算的优先级来计算 ...

  8. 蓝桥杯算法训练 java算法 表达式求值

    问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 - ...

  9. Java描述表达式求值的两种解法:双栈结构和二叉树

    Java描述表达式求值的两种解法:双栈结构和二叉树 原题大意:表达式求值 求一个非负整数四则混合运算且含嵌套括号表达式的值.如: # 输入: 1+2*(6/2)-4 # 输出: 3.0 数据保证: 保 ...

随机推荐

  1. 201521123029《Java程序设计》第十三周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1.网络基础 1.1 比较ping www.baidu.com与ping cec.jmu. ...

  2. Java:Object类的equals()方法 如何编写一个完美的equals()方法

    一  代码实例: package freewill.objectequals;  /** * @author freewill * @see Core Java page161 * @desc get ...

  3. SSH复用代码最终版

    web.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="h ...

  4. editplus的设置

    1, 下载editplus3软件并且进行安装, 我这里是 EditPlus_3.4.1.1123_XiaZaiBa 2, 进行相关设置: 工具-->参数设置-->常规--勾选 (把Edit ...

  5. 快速设计ComboBox下拉框

    传统软件项目开发时,需要每个控件一个一个的来设计,同时需要在页面功能中对每个控件的属性进行判定处理,尤其是页面风格布局样式需要花去一大半的时间,并且后续要想修改是非常麻烦繁琐,这样就导致设计完成一个功 ...

  6. BigDecimal的加减乘除及比较大小

    import java.math.BigDecimal; import static java.lang.System.out; public class BaseClass { public sta ...

  7. 复选框demo

    本篇文章是关于复选框的,有2种形式:1.全选.反选由2个按钮实现:2.全选.反选由一个按钮实现. <!DOCTYPE html> <html> <head> < ...

  8. HCatalog

    HCatalog HCatalog是Hadoop中的表和存储管理层,能够支持用户用不同的工具(Pig.MapReduce)更容易地表格化读写数据. HCatalog从Apache孵化器毕业,并于201 ...

  9. Variational Bayes

    一.前言 变分贝叶斯方法最早由Matthew J.Beal在他的博士论文<Variational Algorithms for Approximate Bayesian Inference> ...

  10. 如何维护一个1000 IP的免费代理池

    楔子 好友李博士要买房了, 前几天应邀帮他抓链家的数据分析下房价, 爬到一半遇到了验证码. 李博士的想法是每天把链家在售的二手房数据都抓一遍, 然后按照时间序列分析. 链家线上在交易的二手房数据大概有 ...