• 数据结构之栈对逆BoLand表达式的计算


    一. 后缀表达式:

    后缀表达式,逆波兰表达式,是指运算符位于操作符之后,计算机对该式是从做到右进行计算,计算过程如下例子

    二.计算思路

    对于后缀表达式的计算,需要一个栈即可,

    即遇见数字压栈,遇见运算符从栈中取出两个数,根据运算进行操作,

    需要注意的是,减法以及除法都是后出栈作为减数或除数,先出栈的作为被减数或者被除数.

    最后将计算结果压入该栈,计算完毕.

    本章给出的是逆波兰表达式(后缀表达式)的计算Demo,为了便于计算,在给出的后缀表达式中加入了空格,并且使用list集合进行遍历,至于中缀怎么转变成后缀,后面文章会给出案例.

    代码如下:

    package com.ebiz.stack;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Stack;
    
    /**
     * @author YHj
     * @create 2019-07-24 14:17
     * 逆波兰表达式,实现计算器
     */
    public class NiPoLandCalculator {
    
        public static void main(String[] args) {
            //定义一个逆波兰表达式(后缀表达式)  (30+4)*5-6 => 30 4+5*6-
            //为了方便,数字以及运算符之间用空格隔开
            String expression="30 4 + 5 * 6 - ";
    
            List<String> list = getList(expression);
    
            int resul=getResult(list);
            System.out.println("resul = " + resul);
    
        }
    
        //输出计算结果
        private static int getResult(List<String> list) {
            Stack<String> stack = new Stack<>();
            for (String s : list) {
                //匹配数字,可匹配多位数
                if (s.matches("\d+")){
                    stack.push(s);
                }else {
                    int num01=Integer.parseInt(stack.pop());
                    int num02=Integer.parseInt(stack.pop());
                    int result=0;
                    if (s.equals("+")){
                        result=num01+num02;
                    }else if (s.equals("-")){
                        result=num02-num01;
                    }else if (s.equals("*")){
                        result=num02*num01;
                    }else if (s.equals("/")){
                        result=num02/num01;
                    }else {
                        throw new RuntimeException("无法解析的字符串");
                    }
                    stack.push(""+result);
                }
            }
            return Integer.parseInt(stack.pop());
        }
    
        //将表达式的值以空格进行拆分,加入到arraylist中,便于操作(不适用索引)
        private static List<String> getList(String str) {
            String[] split = str.split(" ");
            ArrayList<String> list = new ArrayList<>();
            for (String s : split) {
                list.add(s);
            }
            return list;
        }
    
    
    }
  • 相关阅读:
    linux下sar指令查看系统活动报告
    视频卡顿网络侧问题处理----2019-5-17
    mysql中的group by
    多个条件组合的测试用例该如何决策
    对多条件进行组合,生成笛卡尔积的用例集合的python代码实现
    音视频测试相关文档集合
    类型转换
    基本类型:实型(浮点型)
    有符号数和无符号数
    基本类型:整型与字符型
  • 原文地址:https://www.cnblogs.com/jiushixihuandaqingtian/p/11241126.html
Copyright © 2020-2023  润新知