栈应用2 中缀表达式转后缀表达式

来源:互联网 发布:蓝可儿事件真相 知乎 编辑:程序博客网 时间:2024/06/16 21:13
为了简单起见,我们只考虑简单的加减乘除计算
一、算法逻辑
    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
三、算法跟踪
    
扫描字符    操作    表达式    栈1入栈      1 2入栈     1 23入栈      1 2 3*    3 2 出栈   ,计算结果入栈       2*3 = 61 6+    6 1 出栈,计算结果入栈1+6=7    75入栈      7 5 -    5 7出栈,计算结果入栈    7-5= 2    2
计算结果是2
注意:计算时,第一个出栈的元素是第二个操作数。
原创粉丝点击