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

为了简单起见,我们只考虑简单的加减乘除计算
一、算法逻辑
    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 入栈       
2 入栈       1 2
3 入栈        1 2 3
*     3 2 出栈   ,计算结果入栈        2*3 = 6 1 6
+     6 1 出栈,计算结果入栈 1+6=7     7
5 入栈        7 5 
-     5 7出栈,计算结果入栈     7-5= 2     2
计算结果是2
注意:计算时,第一个出栈的元素是第二个操作数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值