为了简单起见,我们只考虑简单的加减乘除计算
一、算法逻辑
1)从左向右扫描后缀表达式
2)初始化栈
3)遍历表达式,直至扫描完所有字符
4)如果被扫描的字符是一个操作数,将其入栈
5)如果被扫描的字符是运算符,出栈两个元素,计算后,结果入栈,注意首先出栈的是第二个操作数
6 )所有都扫描结束后,栈中只有一个元素
7)栈顶元素即是计算结果
二、算法实现
1
2
import java.util.Stack;
3
4
/**计算中辍表达式
5
* Created by Administrator on 2017/6/25 0025.
6
*/
7
public class Operator1Stack {
8
public static void main(String[] args) {
9
String str = "123*+5-";
10
System.out.println(useNum(str));
11
}
12
public static int useNum(String str){
13
char[] chars = str.toCharArray();
14
java.util.Stack<Integer> stack = new Stack<>();
15
for(char c : chars){
16
String s = String.valueOf(c);
17
18
if(!OperatorEnum.isOperator(s)){
19
stack.push(Integer.valueOf(s));
20
}else{
21
Integer a = stack.pop();
22
Integer b = stack.pop();
23
stack.push(useOperator(s,b,a));
24
}
25
}
26
return stack.pop();
27
}
28
public static int useOperator(String operator, int a,int b){
29
if(operator.equals(OperatorEnum.PLUS_SIGN.getOpertor())){
30
return a+b;
31
}
32
if(operator.equals(OperatorEnum.MINUS.getOpertor())){
33
return a-b;
34
}
35
if(operator.equals(OperatorEnum.TIMES_SIGN.getOpertor())){
36
return a*b;
37
}
38
if(operator.equals(OperatorEnum.DIVISION_SIGN.getOpertor())){
39
return a/b;
40
}
41
return 0;
42
}
43
}
44
三、算法跟踪
计算结果是2
注意:计算时,第一个出栈的元素是第二个操作数。