JAVA-算法-中缀表达式转后缀表达式的案例

JAVA-算法-中缀表达式转后缀表达式的学习记录

思路

1.遇到数字直接拼成字符串
2.遇到+ - * / 先判断优先级
优先级高于栈顶的则入栈
否则将栈中现有的更高级或同级运算符进行出栈并拼接
3.遇到括号时
如果是左括号 ‘(’ 直接放入栈中作为优先级最低的
如果是右括号 ‘)’,则将栈中的所有元素出栈拼接,直到左括号为止,保证括号内的先运算
4.遍历完成后,将栈中剩余的出栈拼接
原字符串与结果如下:
a+b ab+
a+b-c ab+c-
a+bc abc+
ab+c abc+
a+bc-d abc+d-
(a+b)c ab+c
(a+bc-d)e abc+d-e
a*(b+c) abc+*

代码实现:

public class StackTest3 {
    public static void main(String[] args) {
        String str1 = "a+b";
        String str2 = "a+b-c";
        String str3 = "a+b*c";
        String str4 = "a*b+c";
        String str5 = "a+b*c-d";
        System.out.println(infixToSuffix(str1));
        System.out.println(infixToSuffix(str2));
        System.out.println(infixToSuffix(str3));
        System.out.println(infixToSuffix(str4));
        System.out.println(infixToSuffix(str5));
        String str6 = "(a+b)*c";
        String str7 = "(a+b*c-d)*e";
        String str8 = "a*(b+c)";
        System.out.println(infixToSuffix(str6));
        System.out.println(infixToSuffix(str7));
        System.out.println(infixToSuffix(str8));

    }

    private static int priority(char c) {
        return switch (c) {
            case '*', '/' -> 2;
            case '+', '-' -> 1;
            case '(' -> 0;
            default -> throw new IllegalArgumentException("符号错误: " + c);
        };
    }

    public static String infixToSuffix(String source) {
        StringBuilder stringBuilder = new StringBuilder();
        // LinkedListStack为定义的符合栈这个数据结构的类
        LinkedListStack<Character> stack = new LinkedListStack<>();
        for (int i = 0; i < source.length(); i++) {
            char cur = source.charAt(i);
            switch (cur) {
                case '+', '-', '*', '/' -> {
                    if (stack.isEmpty()) {
                        stack.push(cur);
                    } else if (priority(cur) > priority(stack.peek())) {
                        stack.push(cur);
                    } else {
                        while (!stack.isEmpty() && priority(cur) <= priority(stack.peek())) {
                            stringBuilder.append(stack.pop());
                        }
                        stack.push(cur);
                    }
                }
                case '(' -> stack.push(cur);
                case ')' -> {
                    while (!stack.isEmpty() && stack.peek() != '(') {
                        stringBuilder.append(stack.pop());
                    }
                    stack.pop();
                }
                default -> stringBuilder.append(cur);
            }
        }
        while (!stack.isEmpty()) {
            stringBuilder.append(stack.pop());
        }
        return stringBuilder.toString();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值