表达式求值--中缀表达式变后缀表达式,并逆波兰表达式计算结果

这里写自定义目录标题

  • 题目
    • 思路
    • 过程
    • 代码

题目

表达式求值--中缀表达式变后缀表达式,并逆波兰表达式计算结果_第1张图片

思路

  1. 表达式转逆波兰表达式
  2. 逆波兰表达式求值

过程

表达式求值--中缀表达式变后缀表达式,并逆波兰表达式计算结果_第2张图片

表达式求值--中缀表达式变后缀表达式,并逆波兰表达式计算结果_第3张图片

代码

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    Map<String, Integer> priority = new HashMap<>();
    public int solve (String s) {
        // write code here
        priority.put("+", 0);
        priority.put("-", 0);
        priority.put("*", 1);
        priority.put("(", 2);
        priority.put(")", 2);
        String[] change = change(s);//中缀变后缀
        return calculate(change);
    }
    public String[] change(String s) {
        Stack<String> resstack = new Stack<>();//逆波兰表达式栈
        Stack<String> opstack = new Stack<>();//运算符的临时栈
        boolean preNumFlag = false;
        String[] exp = s.split("");
        for (int i = 0; i < exp.length; i++) {
            if (isNum(exp[i])) {
                if (!preNumFlag) {
                    resstack.add(exp[i]);
                } else {
                    String join = resstack.pop() + exp[i];
                    resstack.add(join);
                }
                preNumFlag = true;
            } else if ("(".equals(exp[i])) {
                preNumFlag = false;
                opstack.add(exp[i]);
            } else if (")".equals(exp[i])) {
                preNumFlag = false;
                while (!opstack.isEmpty() && !opstack.peek().equals("(")) {
                    resstack.add(opstack.pop());
                }
                opstack.pop();
            } else {//+-*
                preNumFlag = false;
                // 当前运算符小于等于栈顶运算符 -> 栈顶运算符逐个弹入 rpnQueue
                // 当前运算符大于栈顶运算符 -> 将当前运算符压入栈中
                while (!opstack.isEmpty() && priority.get(exp[i]) <= priority.get(opstack.peek()) && !opstack.peek().equals("(")) {
                    resstack.add(opstack.pop());
                }
                opstack.add(exp[i]);
            }
        }
        while (!opstack.isEmpty()) {
            resstack.add(opstack.pop());
        }
        String[] res = new String[resstack.size()];
        for (int i = 0; i < resstack.size(); i++) {
            res[i] = resstack.get(i);
        }
        return res;//转成的后缀表达式
    }

    private boolean isNum(String s) {
        if ("+".equals(s) || "-".equals(s) || "*".equals(s) || "(".equals(s) || ")".equals(s)) {
            return false;
        }
        return true;
    }

    private int calculate(String[] list) {
        Stack<Integer> res = new Stack<>();
        for (int i = 0; i < list.length; i++) {
            String s = list[i];
            if ("+".equals(s)) {
                res.add(res.pop() + res.pop());
            } else if ("-".equals(s)) {
                res.add(-res.pop() + res.pop());
            } else if ("*".equals(s)) {
                res.add(res.pop() * res.pop());
            } else {
                res.add(Integer.parseInt(String.valueOf(s)));
            }
        }
        return res.pop();
    }
}

你可能感兴趣的:(算法,java,leetcode,开发语言)