1. import java.util.Stack;
  2. import java.util.regex.*;
  3. public class StringToArithmetic {
  4. private StringToArithmetic() {
  5. }
  6. /**
  7. * 给出一个算术表达式,返回结果。 例如 (5+8+10)*1,返回23
  8. *
  9. * @param string
  10. */
  11. public static double stringToArithmetic(String string) {
  12. return suffixToArithmetic(infixToSuffix(string));
  13. }
  14. /**
  15. * 中缀表达式转后缀表达式
  16. * 只处理了+,-,*,/和括号,没有处理负号及其它运算符,也没对前缀表达式验证。
  17. * 如要处理负号,可对表达式进行预转义处理,当下面条件成立时,将负号换成单目运算符"!"
  18. *    infix.charAt[i]=='-'&&( i==0||infix.charAt[i-1]=='(')
  19. */
  20. private static String infixToSuffix(String infix) {
  21. Stack<Character> stack = new Stack<Character>();
  22. String suffix = "";
  23. int length = infix.length();
  24. for (int i = 0; i < length; i++) {
  25. Character temp;
  26. char c = infix.charAt(i);
  27. switch (c) {
  28. // 忽略空格
  29. case ' ':
  30. break;
  31. // 碰到'(',push到栈
  32. case '(':
  33. stack.push(c);
  34. break;
  35. // 碰到'+''-',将栈中所有运算符弹出,送到输出队列中
  36. case '+':
  37. case '-':
  38. while (stack.size() != 0) {
  39. temp = stack.pop();
  40. if (temp == '(') {
  41. stack.push('(');
  42. break;
  43. }
  44. suffix += " " + temp;
  45. }
  46. stack.push(c);
  47. suffix += " ";
  48. break;
  49. // 碰到'*''/',将栈中所有乘除运算符弹出,送到输出队列中
  50. case '*':
  51. case '/':
  52. while (stack.size() != 0) {
  53. temp = stack.pop();
  54. if (temp == '(' || temp == '+' || temp == '-') {
  55. stack.push(temp);
  56. break;
  57. } else {
  58. suffix += " " + temp;
  59. }
  60. }
  61. stack.push(c);
  62. suffix += " ";
  63. break;
  64. // 碰到右括号,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号
  65. case ')':
  66. while (stack.size() != 0) {
  67. temp = stack.pop();
  68. if (temp == '(')
  69. break;
  70. else
  71. suffix += " " + temp;
  72. }
  73. //suffix += " ";
  74. break;
  75. default:
  76. suffix += c;
  77. }
  78. }
  79. while (stack.size() != 0)
  80. suffix += " " + stack.pop();
  81. return suffix;
  82. }
  83. public static void main(String args[]){
  84. System.out.println(infixToSuffix("3+(2-5)*6/3"));
  85. System.out.println(stringToArithmetic("3+(2-5)*6/3"));
  86. }
  87. /**
  88. * 通过后缀表达式求出算术结果
  89. *
  90. * @param String
  91. *            postfix
  92. * @return double
  93. */
  94. private static double suffixToArithmetic(String postfix) {
  95. Pattern pattern = Pattern.compile("\\d+||(\\d+\\.\\d+)"); // 匹配数字
  96. String strings[] = postfix.split(" ");
  97. for (int i = 0; i < strings.length; i++)
  98. strings[i].trim();
  99. Stack<Double> stack = new Stack<Double>();
  100. for (int i = 0; i < strings.length; i++) {
  101. if (strings[i].equals(""))
  102. continue;
  103. if ((pattern.matcher(strings[i])).matches()) {
  104. stack.push(Double.parseDouble(strings[i]));
  105. } else {
  106. double y = stack.pop();
  107. double x = stack.pop();
  108. stack.push(caculate(x, y, strings[i]));
  109. }
  110. }
  111. return stack.pop();
  112. }
  113. private static double caculate(double x, double y, String simble) {
  114. if (simble.trim().equals("+"))
  115. return x + y;
  116. if (simble.trim().equals("-"))
  117. return x - y;
  118. if (simble.trim().equals("*"))
  119. return x * y;
  120. if (simble.trim().equals("/"))
  121. return x / y;
  122. return 0;
  123. }
  124. }

转载于:https://www.cnblogs.com/ikobe621/archive/2013/03/31/2991329.html

java 中缀式转后缀式相关推荐

  1. nyoj-257-郁闷的C小加(一 )中缀式变后缀式

    题目链接:here~~~~~~~ 今天看了此题,感觉栈和队列很好用,进一步深入了解 一个算术表达式,含有数字(为简化处理,数字只有一位),运算符:+.-.*,以及括号,求表达式的值. 给出的表达式是一 ...

  2. NYOJ 467 中缀式变后缀式

    中缀式变后缀式 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更"习惯于"后缀式,关于算术表达 ...

  3. java自动递增前缀式和后缀式区别

    java自动递增前缀式和后缀式区别 java自动递增(自动递减)前缀式表达式 '++' 操作符位于变量或表达式的前面,而后缀式表达式'++'位于变量或表达式的后面,Example: 前缀式: ++i: ...

  4. c 语言表达式求值中缀变后缀,表达式求值关于中缀式转后缀式的问题!

    已结贴√ 问题点数:10 回复次数:6 表达式求值关于中缀式转后缀式的问题! 本人看资料的时候遇到一段代码,这段代码中转为后缀式的优先级那句不明白,请大神赐教,代码如下(c语言) #include # ...

  5. nyoj 1272 表达式求值(中缀式转后缀式)

    表达式求值 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表达式,则 X+ ...

  6. 算术表达式的前缀式、中缀式、后缀式相互转换

    中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀 ...

  7. 语法树,前缀式,中缀式,后缀式

    前序遍历:根左右 中序遍历:左根右 后序遍历:左右根 前缀式:+AB 中缀式:A+B 后缀式:AB+ 例题一: 前序遍历(前缀式):- + 4 * 1 - 5 2 / 6 3 根在前,从最后开始:-5 ...

  8. 逆波兰式(后缀式)详解

    原表达式:a*(b*(c+d/e)-f)#    /* # 为表达式结束符号*/ 后缀式:abcde/+*f-*# 为运算符定义优先级:#   (   +   -   *   /   ** -1   ...

  9. java中缀表达式转后缀表达式(逆波兰算法)

    四则运算是栈的重要应用之一 中缀表达式转后缀表达式(逆波兰算法)过程 从左到右遍历中缀表达式 数字直接输出为后缀表达式一部分 如果是符号,则判断与栈顶元素的优先级 高于栈顶元素优先级直接入栈 低于或等 ...

最新文章

  1. Regular Expression Matching
  2. Android下载文件(一)下载进度断点续传
  3. python socket发送数组_利用pyprocessing初步探索数组排序算法可视化
  4. 电商产品评论数据情感分析代码详解
  5. Git missing Change-Id in commit message footer解决方法
  6. dnn学习:数据访问(1)
  7. [洛谷P3807]【模板】卢卡斯定理
  8. 为什么谐振时电抗为0_变频谐振耐压试验装置在进行电缆耐压试验原理
  9. 微信发红包的测试用例
  10. 一图读懂敏捷开发参与者及基本流程
  11. Java中无穷大、无穷小、非数、最大值、最小值
  12. sql dateadd函数_什么是SQL Server DATEADD()函数?
  13. OAuth1.0实践之foursquare客户端同步到饭否
  14. Python小白的进阶之路---Day5
  15. Unequal Array
  16. 算法——取球问题(特殊球法)
  17. rust中文补丁steam_steam腐蚀中文设置
  18. 三维计算机辅助设计教程,三维计算机辅助设计教程-Pro ENGINEER.pdf
  19. hpp.h与.h的区别
  20. python整蛊:无限自动发消息给好G友...已经在挨罚了......

热门文章

  1. 20200922:leetcode35周双周赛题解记录(下)
  2. redis set不可重复_Redis的使用
  3. linux 关机命令_小猿圈Linux基础命令汇总
  4. Win32 Application 、Win32 Console Application、MFC工程项目
  5. 刚刚,无人驾驶公司Roadstar,发公告把联合创始人开除了
  6. Hinton领衔谷歌大脑新研究,拯救被认成步枪的乌龟
  7. Google地图更新,更AI更贴心更节约时间,就是不敢来中国
  8. 独家 | Face++印奇:AI是场持久战,但第一阶段明年结束
  9. 吴恩达悄然发布AI维基,另外他的技术岗已经招满了
  10. 关于hibernate的一些小记