5.5_表达式

 


 

 1.表达式


2.前缀表达式


 

3.中缀表达式


 

4.后缀表达式


 

5.中缀表达式转后缀表达式


 

6.中缀表达式转前缀表达式


 

7.中缀表达式转前缀表达式、后缀表达式代码实现

复制代码
class UtilClass {
    /*将字符串表达式,拆分成操作数、运算符数组
     *   1.从左到右扫描expression
     *   2.遇到运算符及括号直接add入数组中
     *   3.遇到操作数就循环判断直到获取完整整数*/
    public static ArrayList<String> str2arr(String expression) {
        int strsize = expression.length();
        ArrayList<String> arr = new ArrayList<>();

        for (int i = 0; i < strsize; i++) {
            String str = expression.charAt(i) + "";
            boolean isnum = str.matches("\\d");
            if (isnum) {
                String num = "";
                while (true) {
                    str = expression.charAt(i) + "";
                    if (i == strsize - 1) {
                        isnum = false;
                    } else {
                        isnum = (expression.charAt(i + 1) + "").matches("\\d");
                    }
                    num = num + str;
                    if (isnum != true) {
                        break;
                    }
                    i++;
                }
                arr.add(num);
            } else {
                arr.add(str);
            }


        }


        return arr;
    }

    /*将中缀表达式,转换为后缀表达式*/
    public static ArrayList<String> infix2suffix(String expression) {
        ArrayList<String> arr = str2arr(expression);
        Stack<String> s1 = new Stack();//数字栈
        Stack<String> s2 = new Stack();//运算符栈
        for (int i = 0; i < arr.size(); i++) {
            String x = arr.get(i);
            boolean isnum = x.matches("\\d+");
            boolean isright = x.matches("\\)");
            boolean isaddred = x.matches("[\\+\\-]");
            boolean ismuldiv = x.matches("[\\*\\/\\%]");

            if (isnum) {
                s1.push(x);
            } else if (s2.empty()) {
                s2.push(x);
            } else if (isright) {
                while (true) {
                    s1.push(s2.pop());
                    if (s2.peek().matches("\\(")) {
                        break;
                    }
                }
                s2.pop();//弹出( 左括号
            } else if ((isaddred && s2.peek().matches("\\(") != true)) {
                while (true) {
                    s1.push(s2.pop());
                    if (s2.empty() || s2.peek().matches("\\(")) {
                        break;
                    }
                }
                s2.push(x);
            } else if ((ismuldiv && s2.peek().matches("[\\*\\/\\%]"))) {
                while (true) {
                    s1.push(s2.pop());
                    if (s2.empty() || s2.peek().matches("[\\*\\/\\%]") != true) {
                        break;
                    }
                }
                s2.push(x);
            } else {
                s2.push(x);
            }
        }
        while (true) {
            s1.push(s2.pop());
            if (s2.empty()) {
                break;
            }
        }
        String[] arr1 = new String[s1.size()];
        int index = s1.size() - 1;
        while (s1.empty() != true) {
            arr1[index--] = s1.pop();
        }
        return new ArrayList(Arrays.asList(arr1));
    }

    /*将中缀表达式,转换为前缀表达式*/
    public static ArrayList<String> infix2prefix(String expression) {
        ArrayList<String> arr = str2arr(expression);
        Stack<String> s1 = new Stack();//数字栈
        Stack<String> s2 = new Stack();//运算符栈
        for (int i = arr.size() - 1; i >= 0; i--) {
            String x = arr.get(i);
            boolean isnum = x.matches("\\d+");
            boolean isleft = x.matches("\\(");
            boolean isaddred = x.matches("[\\+\\-]");
            if (isnum) {
                s1.push(x);
            } else if (s2.empty()) {
                s2.push(x);
            } else if (isleft) {
                while (true) {
                    s1.push(s2.pop());
                    if (s2.peek().matches("\\)")) {
                        break;
                    }
                }
                s2.pop();//弹出)右括号
            } else if (isaddred && s2.peek().matches("[\\*\\/\\%]")) {
                while (true) {
                    s1.push(s2.pop());
                    if (s2.empty() || s2.peek().matches("[\\*\\/\\%]") != true) {
                        break;
                    }
                }
                s2.push(x);
            } else {
                s2.push(x);
            }
        }
        while (true) {
            s1.push(s2.pop());
            if (s2.empty()) {
                break;
            }
        }
        ArrayList<String> arr1 = new ArrayList<>();
        while (s1.empty() != true) {
            arr1.add(s1.pop());
        }
        return arr1;
    }
}
复制代码

 

8.中缀表达式实现计算结果

复制代码
class InfixCalculator {

    public static Object getResult(String expression) {
        ArrayList arr = UtilClass.str2arr(expression);
        Stack<Integer> numstack = new Stack<>();
        Stack<String> symstack = new Stack<>();
        int s1pop1;
        int s1pop2;
        String s2pop;
        for (int i = 0; i < arr.size(); i++) {
            String x = (String) arr.get(i);
            boolean isnum = x.matches("\\d+");
            boolean isright = x.matches("\\)");
            boolean isaddred = x.matches("[\\+\\-]");
            boolean ismuldiv = x.matches("[\\*\\/\\%]");
            if (isnum) {
                numstack.push(Integer.parseInt(x));
            } else if (symstack.empty()) {
                symstack.push(x);
            } else if (isright) {
                while (true) {
                    s1pop1 = numstack.pop();
                    s1pop2 = numstack.pop();
                    s2pop = symstack.pop();
                    switch (s2pop) {
                        case "+":
                            numstack.push(s1pop2 + s1pop1);
                            break;
                        case "-":
                            numstack.push(s1pop2 - s1pop1);
                            break;
                        case "*":
                            numstack.push(s1pop2 * s1pop1);
                            break;
                        case "/":
                            numstack.push(s1pop2 / s1pop1);
                            break;
                        case "%":
                            numstack.push(s1pop2 % s1pop1);
                            break;
                    }
                    if (symstack.peek().matches("\\(")) {
                        break;
                    }
                }
                symstack.pop();
            } else if (isaddred && symstack.peek().matches("\\(") != true) {
                while (true) {
                    s1pop1 = numstack.pop();
                    s1pop2 = numstack.pop();
                    s2pop = symstack.pop();
                    switch (s2pop) {
                        case "*":
                            numstack.push(s1pop2 * s1pop1);
                            break;
                        case "/":
                            numstack.push(s1pop2 / s1pop1);
                            break;
                        case "%":
                            numstack.push(s1pop2 % s1pop1);
                            break;
                        case "+":
                            numstack.push(s1pop2 + s1pop1);
                            break;
                        case "-":
                            numstack.push(s1pop2 - s1pop1);
                            break;
                    }
                    if (symstack.empty() || symstack.peek().matches("\\(")) {
                        break;
                    }
                }
                symstack.push(x);
            } else if (ismuldiv && symstack.peek().matches("[\\*\\/\\%]")) {
                while (true) {
                    s1pop1 = numstack.pop();
                    s1pop2 = numstack.pop();
                    s2pop = symstack.pop();
                    switch (s2pop) {
                        case "*":
                            numstack.push(s1pop2 * s1pop1);
                            break;
                        case "/":
                            numstack.push(s1pop2 / s1pop1);
                            break;
                        case "%":
                            numstack.push(s1pop2 % s1pop1);
                            break;
                    }
                    if (symstack.empty() || symstack.peek().matches("[\\*\\/\\%]") != true) {
                        break;
                    }
                }
                symstack.push(x);
            } else {
                symstack.push(x);
            }
        }

        while (symstack.empty() != true) {
            s1pop1 = numstack.pop();
            s1pop2 = numstack.pop();
            s2pop = symstack.pop();
            switch (s2pop) {
                case "+":
                    numstack.push(s1pop2 + s1pop1);
                    break;
                case "-":
                    numstack.push(s1pop2 - s1pop1);
                    break;
                case "*":
                    numstack.push(s1pop2 * s1pop1);
                    break;
                case "/":
                    numstack.push(s1pop2 / s1pop1);
                    break;
                case "%":
                    numstack.push(s1pop2 % s1pop1);
                    break;
            }
        }
        return numstack.pop();
    }
}
复制代码

 

9.前缀表达式实现计算结果

复制代码
class PrefixCalculator {
    public static Object getResult(String expression) {
        ArrayList<String> arr = UtilClass.infix2prefix(expression);
        Stack<Integer> numstack = new Stack<>();
        for (int i = arr.size() - 1; i >= 0; i--) {
            String x = arr.get(i);
            boolean isnum = x.matches("\\d+");
            if (isnum) {
                numstack.push(Integer.parseInt(x));
            } else {
                int s1pop1 = numstack.pop();
                int s1pop2 = numstack.pop();
                switch (x) {
                    case "+":
                        numstack.push(s1pop1 + s1pop2);
                        break;
                    case "-":
                        numstack.push(s1pop1 - s1pop2);
                        break;
                    case "*":
                        numstack.push(s1pop1 * s1pop2);
                        break;
                    case "/":
                        numstack.push(s1pop1 / s1pop2);
                        break;
                    case "%":
                        numstack.push(s1pop1 % s1pop2);
                        break;
                }
            }
        }
        return numstack.pop();
    }
}
复制代码

 

10.后缀表达式实现计算结果

复制代码
class SuffixCalculator {
    public static Object getResult(String expression) {
        ArrayList<String> arr = UtilClass.infix2suffix(expression);
        Stack<Integer> numstack = new Stack<>();
        for (int i = 0; i < arr.size(); i++) {
            String x = arr.get(i);
            boolean isnum = x.matches("\\d+");
            if (isnum) {
                numstack.push(Integer.parseInt(x));
            } else {
                int s1pop1 = numstack.pop();
                int s1pop2 = numstack.pop();
                switch (x) {
                    case "+":
                        numstack.push(s1pop2 + s1pop1);
                        break;
                    case "-":
                        numstack.push(s1pop2 - s1pop1);
                        break;
                    case "*":
                        numstack.push(s1pop2 * s1pop1);
                        break;
                    case "/":
                        numstack.push(s1pop2 / s1pop1);
                        break;
                    case "%":
                        numstack.push(s1pop2 % s1pop1);
                        break;
                }
            }
        }
        return numstack.pop();
    }
}
复制代码

 

11.测试

复制代码
public class InfixCalculatorDemo {
    public static void main(String[] args) {
        String exp = "1-2+4+(2+4*3)*2/6+(5*2+1)";
        System.out.println("打印结果:" + (1 - 2 + 4 + (2 + 4 * 3) * 2 / 6 + (5 * 2 + 1)));
        System.out.println("中缀表达式结果:" + InfixCalculator.getResult(exp));
        System.out.println("中缀2后缀:" + UtilClass.infix2suffix(exp));
        System.out.println("中缀2前缀:" + UtilClass.infix2prefix(exp));
        System.out.println("后缀表达式结果:" + SuffixCalculator.getResult(exp));
        System.out.println("前缀表达式结果:" + PrefixCalculator.getResult(exp));
    }
}
复制代码

 

测试结果:

打印结果:18
中缀表达式结果:18
中缀2后缀:[1, 2, -, 4, +, 2, 4, 3, *, +, 2, *, 6, /, +, 5, 2, *, 1, +, +]
中缀2前缀:[+, +, +, -, 1, 2, 4, /, *, +, 2, *, 4, 3, 2, 6, +, *, 5, 2, 1]
后缀表达式结果:18
前缀表达式结果:18

 

posted @   学而不思则罔!  阅读(206)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示