今天一同学做东西要用这个东东,就帮他写了一个,先转化成后缀表达式,然后再
计算.当然也可以直接计算中缀表达式,考虑到要多位数,就没那么做.
支持多位数的带括号的整数的加减乘除.
Java 代码
1. package
2.
3. import java
4. import java
5. import java
6.
7. public class Eval
8. public int eval
9. //转化成后缀表达式
10. return doEval(list); //真正求值
11. }
12.
13. //遇到操作符压栈,遇到表达式从后缀表达式中弹出两个数,计算出结果,压入堆栈
14. private int
15. new
16. String element;
17. int
18. try
19. for ( int i = 0
20. element = list.get(i);
21. if
22. n1 = Integer.parseInt(stack.pop());
23. n2 = Integer.parseInt(stack.pop());
24. result = doOperate(n1,n2,element);
25. new
26. else
27. stack.push(element);
28. }
29. }
30. return
31. catch
32. throw new
33. }
34. }
35.
36. private int doOperate( int n1, int
37. if (operator.equals( "+"
38. return
39. else if (operator.equals( "-"
40. return
41. else if (operator.equals( "*"
42. return
43. else
44. return
45. }
46.
47. private boolean
48. return str.equals( "+" ) || str.equals( "-" ) || str.equals( "*" ) || str.equals( "/"
49. }
50.
51. private List<String> infixExpToPostExp(String exp){ //将中缀表达式转化成为后缀表达式
52. new ArrayList<String>(); //存放转化的后缀表达式的链表
53. new StringBuffer(); //用来保存一个数的
54. new Stack<Character>(); //操作符栈
55. char
56. '#'
57. try
58. for ( int i = 0
59. ch = exp.charAt(i);
60. switch
61. case '+'
62. case '-'
63. case '*'
64. case '/'
65. preChar = opStack.peek();
66. // 如果栈里面的操作符优先级比当前的大,则把栈中优先级大的都添加到后缀表达式列表中
67. while
68. ""
69. opStack.pop();
70. preChar = opStack.peek();
71. }
72. opStack.push(ch);
73. i++;
74. break
75. case '('
76. // 左括号直接压栈
77. opStack.push(ch);
78. i++;
79. break
80. case ')'
81. // 右括号则直接把栈中左括号前面的弹出,并加入后缀表达式链表中
82. char
83. while (c != '('
84. ""
85. c = opStack.pop();
86. }
87. i++;
88. break
89. // #号,代表表达式结束,可以直接把操作符栈中剩余的操作符全部弹出,并加入后缀表达式链表中
90. case '#'
91. char
92. while
93. c1 = opStack.pop();
94. if (c1 != '#'
95. ""
96. }
97. i++;
98. break
99. //过滤空白符
100. case ' '
101. case '/t'
102. i++;
103. break
104. // 数字则凑成一个整数,加入后缀表达式链表中
105. default
106. if
107. while
108. numBuffer.append(ch);
109. ch = exp.charAt(++i);
110. }
111. postExp.add(numBuffer.toString());
112. new
113. else
114. throw new IllegalExpressionException( "illegal operator"
115. }
116. }
117. }
118. catch
119. throw new
120. }
121. return
122. }
123.
124. private int priority( char op){ //定义优先级
125. switch
126. case '+'
127. case '-'
128. return 1
129. case '*'
130. case '/'
131. return 2
132. case '('
133. case '#'
134. return 0
135. }
136. throw new IllegalExpressionException( "Illegal operator"
137. }
138.
139. public static void
140. Eval eval = new Eval
141. int result = eval .eval( "2+3+55*22+21*2+(3+2)*3+4*3+3*4#"
142. System.out.println(result);
143. }
144. }
package edu.jlu.fuliang;
import java
.util.ArrayList;
import java
.util.List;
import java
.util.Stack;
public class Eval
{
public int eval(String exp){
List<String> list = infixExpToPostExp(exp);//转化成后缀表达式
return doEval(list);//真正求值
}
//遇到操作符压栈,遇到表达式从后缀表达式中弹出两个数,计算出结果,压入堆栈
private int doEval(List<String> list) {
Stack<String> stack = new Stack<String>();
String element;
int n1,n2,result;
try{
for(int i = 0; i < list.size();i++){
element = list.get(i);
if(isOperator(element)){
n1 = Integer.parseInt(stack.pop());
n2 = Integer.parseInt(stack.pop());
result = doOperate(n1,n2,element);
stack.push(new Integer(result).toString());
}else{
stack.push(element);
}
}
return Integer.parseInt(stack.pop());
}catch(RuntimeException e){
throw new IllegalExpressionException(e.getMessage());
}
}
private int doOperate(int n1, int n2, String operator) {
if(operator.equals("+"))
return n1 + n2;
else if(operator.equals("-"))
return n1 - n2;
else if(operator.equals("*"))
return n1 * n2;
else
return n1 / n2;
}
private boolean isOperator(String str){
return str.equals("+") || str.equals("-") || str.equals("*") || str.equals("/");
}
private List<String> infixExpToPostExp(String exp){//将中缀表达式转化成为后缀表达式
List<String> postExp = new ArrayList<String>();//存放转化的后缀表达式的链表
StringBuffer numBuffer = new StringBuffer();//用来保存一个数的
Stack<Character> opStack = new Stack<Character>();//操作符栈
char ch,preChar;
opStack.push('#');
try{
for(int i = 0; i < exp.length();){
ch = exp.charAt(i);
switch(ch){
case '+':
case '-':
case '*':
case '/':
preChar = opStack.peek();
// 如果栈里面的操作符优先级比当前的大,则把栈中优先级大的都添加到后缀表达式列表中
while(priority(preChar) >= priority(ch)){
postExp.add(""+preChar);
opStack.pop();
preChar = opStack.peek();
}
opStack.push(ch);
i++;
break;
case '(':
// 左括号直接压栈
opStack.push(ch);
i++;
break;
case ')':
// 右括号则直接把栈中左括号前面的弹出,并加入后缀表达式链表中
char c = opStack.pop();
while(c != '('){
postExp.add("" + c);
c = opStack.pop();
}
i++;
break;
// #号,代表表达式结束,可以直接把操作符栈中剩余的操作符全部弹出,并加入后缀表达式链表中
case '#':
char c1;
while(!opStack.isEmpty()){
c1 = opStack.pop();
if(c1 != '#')
postExp.add("" + c1);
}
i++;
break;
//过滤空白符
case ' ':
case '/t':
i++;
break;
// 数字则凑成一个整数,加入后缀表达式链表中
default:
if(Character.isDigit(ch)){
while(Character.isDigit(ch)){
numBuffer.append(ch);
ch = exp.charAt(++i);
}
postExp.add(numBuffer.toString());
numBuffer = new StringBuffer();
}else{
throw new IllegalExpressionException("illegal operator");
}
}
}
}catch(RuntimeException e){
throw new IllegalExpressionException(e.getMessage());
}
return postExp;
}
private int priority(char op){//定义优先级
switch(op){
case'+':
case'-':
return 1;
case'*':
case'/':
return 2;
case'(':
case'#':
return 0;
}
throw new IllegalExpressionException("Illegal operator");
}
public static void main(String[] args) {
Eval
eval
= new Eval
();
int result = eval
.eval("2+3+55*22+21*2+(3+2)*3+4*3+3*4#");
System.out.println(result);
}
}
Java 代码