逆波兰表达式的运算

  • 将字符串分割放入list集合中
  • 从list集合中取出按照一定规则放入栈得出结果
package com.hhit.stack;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class PolandNotation {
    public static void main(String[] args) {
        String suffixExpression="30 4 + 5 * 6 -";//(30+4)*5-6
        List<String> lis=getListString(suffixExpression);
        System.out.println(lis);
        System.out.println(calculate(lis));
        //将一个逆波兰表达式,依次将数据和运算符放入到ArrayList中
    }

    public static List<String> getListString(String suffixExpression){
        String[] split=suffixExpression.split(" ");
        List<String> list=new ArrayList<String>();
        for (String s:split){
            list.add(s);
        }

        return list;

    }

    public static  int calculate(List<String> ls){
        //创建一个栈
        Stack<String> stack=new Stack<String>();
        //遍历ls
        for (String item:ls){
            //使用正则表达式来取出数据
            if(item.matches("\\d+")){
                //匹配的是多位数
                stack.push(item);
            }else {
                //pop出两个数进行计算
                int num2=Integer.parseInt(stack.pop());
                int num1=Integer.parseInt(stack.pop());
                int res=0;
                if (item.equals("+")){
                    res=num1+num2;
                }else if (item.equals("-")){
                    res=num1-num2;
                }else if (item.equals("*")){
                    res=num1*num2;
                }else if (item.equals("/")){
                    res=num1/num2;
                }else {
                    throw new RuntimeException("运算符有误");
                }
                stack.push(""+res);

            }
        }
        return Integer.parseInt(stack.pop());
    }
}

你可能感兴趣的:(数据结构与算法(java))