逆波兰计算器(后缀表达式实现简单计算器)

后缀表达式实现简单计算器(逆波兰计算器 )

  • 中缀表达式:(3+4)×5-6 ------> 后缀表达式: 3 4 + 5 × 6 -
  • 输入一个逆波兰表达式(后缀表达式),使用栈(Stack), 计算其结果

举个栗子: (3+4)×5-6 对应的后缀表达式就是 34+5 × 6-, 针对后缀表达式求值步骤如下:

  1. 从左至右扫描,将 3 和 4 压入堆栈;
  2. 遇到+运算符,因此弹出 4 和 3(4 为栈顶元素,3 为次顶元素),计算出 3+4 的值,得 7,再将 7 入栈;
  3. 将 5 入栈;
  4. 接下来是×运算符,因此弹出 5 和 7,计算出 7×5=35,将 35 入栈;
  5. 将 6 入栈;
  6. 最后是-运算符,计算出 35-6 的值,即 29,由此得出最终结果。
代码实现:

package com.sai.stack;

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

/**
 * @Author sai
 * @Description 用后缀表达式实现简单计算器
 * @Time 2020-07-08 10:45
 */
public class SuffixExpression {


    //获取计算结果
    public int get(List list){

        int sum = 0;
        Stack stack = new Stack();
        for (String item : list){
            if(item.matches("\\d+")){
                stack.push(item);
            }else {
                int num2 = Integer.parseInt(stack.pop());
                int num1 = Integer.parseInt(stack.pop());
                if(item.equals("+")){
                    sum = num1 + num2;
                }else if (item.equals("-")){
                    sum = num1 - num2;
                }else if (item.equals("*")){
                    sum = num1 * num2;
                }else if (item.equals("/")){
                    sum = num1 / num2;
                }else {
                    throw new RuntimeException("字符有误!");
                }

//                System.out.println("----->"+sum);
                stack.push(""+sum);
            }
        }
        sum = Integer.parseInt(stack.pop());

        return sum;
    }

    //获取集合
    public List getList(String expression){
        List list = new ArrayList();

        String[] l = expression.split(" ");

        for (String item:l) {
            list.add(item);
        }

        return list;
    }

}

测试类:

package com.sai.stack;

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

/**
 * @Author sai
 * @Description SuffixExpression的测试类
 * @Time 2020-07-08 11:21
 */
public class SuffixExpression_Test {
    public static void main(String[] args) {
        SuffixExpression suffixExpression = new SuffixExpression();

        String expression =  "30 4 + 5 * 6 -";  //----->164
        String expression2= "4 5 * 8 - 60 + 8 2 / +";  //----->76
        String expression3= "3 4 + 5 * 6 -";  //----->29

        //将字符串转换为集合
        List list = suffixExpression.getList(expression3);
        System.out.println(list);

        //将集合遍历运算,得到结果
        int sum = suffixExpression.get(list);
        System.out.println("运算结果为:"+sum);

    }
}

你可能感兴趣的:(逆波兰计算器(后缀表达式实现简单计算器))