java实现计算算术表达式的值(后缀表达式方式)

Java代码  

  1. package zn.sd.ly.jtree.test;
  2. /**
  3. * 表达式
  4. *
  5. * @author 风华褚胜--刘胜军
  6. */
  7. import java.util.Arrays;
  8. import java.util.Scanner;
  9. import java.util.Stack;
  10. public class Four {
  11. @SuppressWarnings("resource")
  12. public static void main(String[] args) {
  13. Scanner sc = new Scanner(System.in);
  14. System.out.println("请输入标准表达式(exit退出):");
  15. String str = sc.nextLine();
  16. while (!str.equals("exit")) {
  17. if (judge_kuohao(str)) {
  18. System.out.println("括号匹配成功!");
  19. System.out.println(jisuan(getHouzhui(f(str))));
  20. } else {
  21. System.out.println("括号匹配不成功,或者包含不规则括号!");
  22. }
  23. System.out.println("请输入标准表达式(exit退出):");
  24. str = sc.nextLine();
  25. }
  26. }
  27. /**
  28. *
  29. * @param str
  30. *            传入的完整算术表达试字符串
  31. * @return 返回boolean值,如果匹配成功,返回true,反之false
  32. */
  33. public static boolean judge_kuohao(String str) {
  34. Stack<Character> s = new Stack<Character>();
  35. /**********************************/
  36. char[] ch = new char[128];
  37. ch[‘1‘] = ‘1‘;
  38. ch[‘2‘] = ‘2‘;
  39. ch[‘3‘] = ‘3‘;
  40. ch[‘4‘] = ‘4‘;
  41. ch[‘5‘] = ‘5‘;
  42. ch[‘6‘] = ‘6‘;
  43. ch[‘7‘] = ‘7‘;
  44. ch[‘8‘] = ‘8‘;
  45. ch[‘9‘] = ‘9‘;
  46. ch[‘0‘] = ‘0‘;
  47. ch[‘(‘] = ‘(‘;
  48. ch[‘)‘] = ‘)‘;
  49. ch[‘[‘] = ‘[‘;
  50. ch[‘]‘] = ‘]‘;
  51. ch[‘{‘] = ‘{‘;
  52. ch[‘}‘] = ‘}‘;
  53. ch[‘.‘] = ‘.‘;
  54. ch[‘+‘] = ‘+‘;
  55. ch[‘-‘] = ‘-‘;
  56. ch[‘*‘] = ‘*‘;
  57. ch[‘/‘] = ‘/‘;
  58. /**********************************/
  59. for (int i = 0; i < str.length(); i++) {
  60. char t = str.charAt(i);
  61. if (t > 128 || ch[t] != t) {
  62. return false;
  63. }
  64. if (t == ‘(‘ || t == ‘[‘ || t == ‘{‘) {
  65. s.push(t);
  66. } else if (t == ‘)‘ || t == ‘]‘ || t == ‘}‘) {
  67. char temp = ‘\u0000‘;
  68. if (s.size() > 0)
  69. temp = s.pop();
  70. else
  71. return false;
  72. if (!((temp == ‘(‘ && t == ‘)‘) || (temp == ‘[‘ && t == ‘]‘) || (temp == ‘{‘ && t == ‘}‘))) {
  73. return false;
  74. }
  75. } else {
  76. }
  77. }
  78. if (s.size() != 0)
  79. return false;
  80. return true;
  81. /**********************************/
  82. }
  83. /**
  84. *
  85. * @param str
  86. *            传入的完整算术表达试字符串
  87. * @return 完整算术表达试字符串中每个元素组合而成的数组
  88. */
  89. public static Object[] f(String str) {
  90. Stack<Object> s = new Stack<Object>();
  91. int left = 0, right = 0, tag = ((str.charAt(0) >= ‘0‘ && str.charAt(0) <= ‘9‘)
  92. || (str.charAt(0) == ‘.‘) ? 0 : 1);
  93. for (int i = 0; i < str.length(); i++) {
  94. char t = str.charAt(i);
  95. if ((t >= ‘0‘ && t <= ‘9‘) || (t == ‘.‘)) {
  96. right++;
  97. tag = 0;
  98. } else {
  99. if (left != right) {
  100. s.push(new Double(str.substring(left, right)));
  101. left = right;
  102. }
  103. right++;
  104. s.push(str.substring(left, right));
  105. left = right;
  106. tag = 1;
  107. }
  108. if (right == str.length()) {
  109. if (left != right) {
  110. if (tag == 1)
  111. s.push(str.substring(left, right));
  112. else
  113. s.push(new Double(str.substring(left, right)));
  114. left = right;
  115. }
  116. }
  117. }
  118. System.out.println(Arrays.toString(s.toArray()));
  119. return s.toArray();
  120. }
  121. /**
  122. * 获取后缀表达式
  123. *
  124. * @param f
  125. *            完整算术表达试字符串中每个元素组合而成的数组
  126. * @return 后缀表达式数组
  127. */
  128. public static Object[] getHouzhui(Object[] f) {
  129. Stack<Object> s = new Stack<Object>();
  130. Stack<Object> n = new Stack<Object>();
  131. for (int i = 0; i < f.length; i++) {
  132. if (f[i].equals("(") || f[i].equals("[") || f[i].equals("{")) {
  133. s.push("(");
  134. } else if (f[i].equals("*")) {
  135. while ("/".equals((s.size() > 0) ? s.lastElement() : "")) {
  136. n.push(s.pop());
  137. }
  138. s.push("*");
  139. } else if (f[i].equals("/")) {
  140. while ("*".equals((s.size() > 0) ? s.lastElement() : "")) {
  141. n.push(s.pop());
  142. }
  143. s.push("/");
  144. } else if (f[i].equals("+")) {
  145. while (("*".equals((s.size() > 0) ? s.lastElement() : ""))
  146. || ("/").equals((s.size() > 0) ? s.lastElement() : "")
  147. || ("-").equals((s.size() > 0) ? s.lastElement() : "")) {
  148. n.push(s.pop());
  149. }
  150. s.push("+");
  151. } else if (f[i].equals("-")) {
  152. while (("*".equals((s.size() > 0) ? s.lastElement() : ""))
  153. || ("/").equals((s.size() > 0) ? s.lastElement() : "")
  154. || ("+").equals((s.size() > 0) ? s.lastElement() : "")) {
  155. n.push(s.pop());
  156. }
  157. s.push("-");
  158. } else if (f[i].equals(")") || f[i].equals("]") || f[i].equals("}")) {
  159. while (!"(".equals((s.size() > 0) ? s.lastElement() : "")) {
  160. n.push(s.pop());
  161. }
  162. s.pop();
  163. } else {
  164. n.push(f[i]);
  165. }
  166. }
  167. while (s.size() > 0)
  168. n.push(s.pop());
  169. return n.toArray();
  170. }
  171. /**
  172. * 计算
  173. *
  174. * @param f
  175. * @return
  176. */
  177. public static double jisuan(Object[] f) {
  178. Stack<Object> s = new Stack<Object>();
  179. for (int i = 0; i < f.length; i++) {
  180. if (f[i] instanceof Double) {
  181. s.push(f[i]);
  182. } else if ("+".equals(f[i])) {
  183. double left = (double) s.pop();
  184. double right = (double) s.pop();
  185. s.push(jia(right, left));
  186. } else if ("-".equals(f[i])) {
  187. double left = (double) s.pop();
  188. double right = (double) s.pop();
  189. s.push(jian(right, left));
  190. } else if ("*".equals(f[i])) {
  191. double left = (double) s.pop();
  192. double right = (double) s.pop();
  193. s.push(cheng(right, left));
  194. } else if ("/".equals(f[i])) {
  195. double left = (double) s.pop();
  196. double right = (double) s.pop();
  197. s.push(chu(right, left));
  198. } else {
  199. }
  200. }
  201. return (double) s.pop();
  202. }
  203. public static double jia(double a, double b) {
  204. return a + b;
  205. }
  206. public static double jian(double a, double b) {
  207. return a - b;
  208. }
  209. public static double cheng(double a, double b) {
  210. return a * b;
  211. }
  212. public static double chu(double a, double b) {
  213. return a / b;
  214. }
  215. }

》》源码地址获取

springmvc + mybatis整合详细,及遇到的问题请参看以下资料:

参考资料:

http://www.springmvc,net/detail/6074493.html

http://my.spring.net/wangbiglei/blog/489583

http://my.springmvc.net/wangbiglei/blog/489604

时间: 2024-10-21 19:35:29

java实现计算算术表达式的值(后缀表达式方式)的相关文章

中缀表达式转换成后缀表达式并求值

算法: 中缀表达式转后缀表达式的方法: 1.遇到操作数:直接输出(添加到后缀表达式中) 2.栈为空时,遇到运算符,直接入栈 3.遇到左括号:将其入栈 4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出. 5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈 6.最终将栈中的元素依次出栈,输出. 例如 a+b*c+(d*e+f)*g ----> abc*+de*f+g*+ 遇到a:直接输出: 后缀表达式:a 堆栈:空 遇到

中缀表达式转成后缀表达式

参考 数据结构Java实现06----中缀表达式转换为后缀表达式 将中缀表达式转化为后缀表达式 Mycode 1 package collection_Exe; 2 3 import java.util.*; 4 5 public class Exe16 { 6 public static void main(String[] args) { 7 Scanner input = new Scanner(System.in); 8 System.out.println("Input :"

将中缀表达式转化为后缀表达式

我们把平时所用的标准四则运算表达式,即“9+(3-1)*3+10/2"叫做中缀表达式.因为所有的运算符号都在两数字的中间,现在我们的问题就是中缀到后缀的转化. 中缀表达式“9+(3-1)*3+10/2”转化为后缀表达式“9 3 1-3*+ 10 2/+” 规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分:若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出找并输出,并将当前符号进栈,一直到最终输出后缀表达式为止.

栈的应用之中缀表达式转化为后缀表达式(逆波兰表达式)

1 #include<stdio.h> 2 #include<stdlib.h> 3 4 #define OK 1 5 #define ERROR 0 6 #define STACK_INIT_SIZE 20 7 #define STACK_INCREMENT 10 8 9 typedef char Elemtype; 10 typedef int Status; 11 12 typedef struct StackNode{ 13 Elemtype* base; 14 Elemt

[Swust OJ 322]--东6宿舍灵异事件(中缀表达式转化为后缀表达式的简单运用)

题目链接:http://acm.swust.edu.cn/problem/322/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 将军听说最近东6闹鬼了,作为一个无神论者,将军当然不相信.但是这个传言已经泛滥了,许多人都在说这个事情,将军从每个人那里听到一个传言,将军可以容易的就知道这个传言是真还是假,但是当一大堆消息组合起来,将军就不知道了,所以将军就找到了你. 提供两种组合方式: A&B:代表A和B都为真的时候,A和B组合起

算数表达式求值(中缀表达式转后缀表达式并求值)

中缀表达式转后缀表达式的规则:1.遇到操作数:直接输出(添加到后缀表达式中)2.栈为空时,遇到运算符,直接入栈3.遇到左括号:将其入栈4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出.5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈(如果此时栈顶的运算符为"(",则将这个运算符也压入栈中)6.最终将栈中的元素依次出栈,输出 具体代码实现: 第一步:中缀表达式转后缀表达式 1 package data.st

P1310 表达式的值 (表达式计算)

题目链接 解法: 栈 1 #include <bits/stdc++.h> 2 # define LL long long 3 using namespace std; 4 5 const int mod=10007; 6 stack<char> ope; 7 stack<int> one; 8 stack<int> zero; 9 10 void calc(){ 11 char o=ope.top(); 12 ope.pop(); 13 int one1=

中缀表达式转化为后缀表达式

后缀表达式 逆波兰记法中,操作符置于操作数的后面.例如表达"三加四"时,写作"3 4 +",而不是"3 + 4".如果有多个操作符,操作符置于第二个操作数的后面,所以常规中缀记法的"3 - 4 + 5"在逆波兰记法中写作"3 4 - 5 +":先3减去4,再加上5.使用逆波兰记法的一个好处是不需要使用括号.例如中缀记法中"3 - 4 * 5"与"(3 - 4)*5"不

中缀表达式转换成后缀表达式

中缀表达式即普通的运算式子,运算符是以中缀形式处于操作数的中间(例:3 + 4),后缀表达式就是逆波兰式(例:3 4 +),中缀表达式转后缀表达式也是学习数据结构中的栈的时候一个典型的例子,结合上一次写到逆波兰式.可以用这种原理即输入普通式子(即中缀表达式),转换成后缀表达式,然后通过后缀表达式(逆波兰式)的计算,可以得出结果. 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define STACK_INIT_SIZE 20 4 #de