逆波兰计算器(java)

简介: 逆波兰计算器(java)
import java.util.*;
 
public class PolandNotation {
    public static void main(String[] args) {
        String expression = "1+((2+3)*4)-5";
        //将中缀表达式分割保存到ArrayList 1+((2+3)*4)-5"-> [1, +, (, (, 2, +, 3, ), *, 4, ), -, 5]
        List<String> list = toInfixExpressionList(expression);
        //中缀表达式转换为后缀表达式[1, +, (, (, 2, +, 3, ), *, 4, ), -, 5]->[1, 2, 3, +, 4, *, +, 5, -]
        List<String> temp = parseSuffixExpressionList(list);
        //16
        System.out.println(calNum(temp));
    }
 
    //1+((2+3)*4)-5"-> [1, +, (, (, 2, +, 3, ), *, 4, ), -, 5]
    private static List<String> toInfixExpressionList(String expression) {
        List<String> res = new ArrayList<>();
        int length = expression.length();
        String temp = "";
        for (int i = 0; i < length; i++) {
            char ch = expression.charAt(i);
            if (Arrays.asList('+', '-', '*', '/', '(', ')').contains(ch)) {
                if (temp != "") {
                    res.add(temp);
                    temp = "";
                }
                res.add(String.valueOf(ch));
            } else {
                temp += ch;
            }
        }
        //将最后一位数字保存
        res.add(temp);
        return res;
    }
 
    //将中缀表达式转换为后缀表达式
    public static List<String> parseSuffixExpressionList(List<String> ls) {
        Stack<String> s1 = new Stack<>();
        List<String> s2 = new ArrayList<>();
        for (String item : ls) {
            if (item.matches("\\d+")) {
                s2.add(item);
            } else if (item.equals("(")) {
                s1.push(item);
            } else if (item.equals(")")) {
                while (!s1.peek().equals("(")) {
                    s2.add(s1.pop());
                }
                //删除左括号
                s1.pop();
            } else {
                while (!s1.isEmpty() && getOperationValue(s1.peek()) >= getOperationValue(item)) {
                    s2.add(s1.pop());
                }
                s1.push(item);
            }
        }
        while (!s1.isEmpty()) {
            s2.add(s1.pop());
        }
        return s2;
    }
 
    //获取操作符合优先级别
    public static int getOperationValue(String item) {
        return Arrays.asList("*", "/").contains(item) ? 2 : Arrays.asList("+", "-").contains(item) ? 1 : 0;
    }
 
    /**
     * 完成计算
     * @param list
     * @return
     */
    private static Integer calNum(List<String> list) {
        Stack<Integer> stack = new Stack<Integer>();
        for (String item : list) {
            //判断是否是数字
            if (!item.matches("\\d+")) {
                int num1 = stack.pop();
                int num2 = stack.pop();
                int res = 0;
                switch (item) {
                    case "+":
                        res = num1 + num2;
                        break;
                    case "-":
                        res = num2 - num1;
                        break;
                    case "*":
                        res = num1 * num2;
                        break;
                    case "/":
                        res = num2 / num1;
                        break;
                    default:
                        break;
 
                }
                stack.push(res);
            } else {
                stack.push(Integer.valueOf(item));
            }
        }
        return stack.pop();
    }
}

中缀转后缀

后缀表达式计算

目录
相关文章
|
2月前
|
Java
简单的 Java 计算器示例
【5月更文挑战第1天】这是一个Java计算器程序,接收用户输入的两个数字和一个运算符(+,-,*,/),通过`Scanner`获取输入,使用`switch`进行计算。当运算符为除法时,检查除数是否为0,防止除零错误。最后,它打印出计算结果。
28 0
|
2月前
|
Java 数据库连接
Java混合计算器以及界面切换
Java混合计算器以及界面切换
|
2月前
|
Java
Java实现简易计算器
Java实现简易计算器
167 5
|
2月前
|
数据可视化 小程序 Java
【Java】——实现可视化加减乘除计算器
【Java】——实现可视化加减乘除计算器
68 0
【Java】——实现可视化加减乘除计算器
|
2月前
|
Java
【Java每日一题】— —第十三题:实现简单的计算器
【Java每日一题】— —第十三题:实现简单的计算器
33 0
|
2月前
|
Python Java Go
Java每日一练(20230416) 三数之和、基本计算器、通配符匹配
Java每日一练(20230416) 三数之和、基本计算器、通配符匹配
38 0
Java每日一练(20230416) 三数之和、基本计算器、通配符匹配
|
2月前
|
Python Java 算法
Java每日一练(20230415) 扰乱字符串、单词拆分、模拟计算器
Java每日一练(20230415) 扰乱字符串、单词拆分、模拟计算器
38 0
Java每日一练(20230415) 扰乱字符串、单词拆分、模拟计算器
|
2月前
|
Java
用Java编写一个代码实现计算器功能
【1月更文挑战第17天】用Java编写一个代码实现计算器功能
33 0
|
2月前
|
Java 程序员
java实现简单计算器(二)
java实现简单计算器(二)
|
Java
java---计算器图形界面(无功能)
package cn.hncu.chx1; import java.awt.BorderLayout; import java.awt.Button; import java.awt.
954 0