中缀表达式转后缀表达式---简化版(支持括号、多位数)

步骤

1)初始化两个栈:运算符栈s1和储存中间结果的栈s2;2)从左至右扫描中缀表达式;
3)遇到操作数时,将其压s2;
4)遇到运算符时,比较其与s1栈顶运算符的优先级:
1.如果s1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;
2.否则,若优先级比栈顶运算符的高,也将运算符压入 s1;
3.否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的 栈顶运算符相比较;5)遇到括号时:
(5)如果是左括号“(”,则直接压入s1
(6)如果是右括号“)”,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃6)重复步骤2至5,直到表达式的最右边
7)将s1中剩余的运算符依次弹出并压入 s2
8)依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式

代码实现

package com.monster.stack;

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

/**
 * @author Monster
 * @version v1.0
 * @time 03-16-2021 22:10:33
 * @description:
 */
public class InfixToSuffix {

    public static void main(String[] args) {
        String expression = "(12+(9+3*7)+10)";
        // 字符串转成List集合  12 + ( ( 3 * 7 - 2 ) + 10 )
        List<String> list = toArrayList(expression);
        List<String> suffixList = toSuffix(list);
        suffixList.forEach(System.out::print);
    }

    public static List<String> toSuffix(List<String> list) {

        List<String> suffixList = new ArrayList<>();

        Stack<String> operateStack = new Stack<>();

        for (String s : list) {

            if (s.matches("\\d+")) {
                suffixList.add(s);
            } else if ("(".equals(s)) {
                operateStack.push(s);
            } else if (")".equals(s)) {
                while (!"(".equals(operateStack.peek())) {
                    suffixList.add(operateStack.pop());
                }
                operateStack.pop();
            } else {
                while (!operateStack.empty() && getPriority(s) <= getPriority(operateStack.peek())) {
                    suffixList.add(operateStack.pop());
                }
                operateStack.push(s);
            }
        }
        while (!operateStack.empty()) {
            suffixList.add(operateStack.pop());
        }
        return suffixList;
    }

    public static int getPriority(String s) {
        if ("+".equals(s) || "-".equals(s)) {
            return 0;
        } else if ("*".equals(s) || "/".equals(s)) {
            return 1;
        }else {
            return -1;
        }
    }

    public static List<String> toArrayList(String expression) {

        String s = "";
        List<String> list = new ArrayList<>();
        for (int i = 0; i < expression.length(); i++) {

            char c = expression.charAt(i);

            if (isOperate(c) || c == '(' || c == ')') {
                list.add(Character.toString(c));
            }

            if (isNumber(c)) {
                if (!isNumber(expression.charAt(i + 1))) {
                    s += c;
                    list.add(s);
                    s = "";
                } else {
                    s += c;
                }
            }
        }
        return list;
    }

    public static boolean isOperate(char c) {
        return c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')';
    }

    public static boolean isNumber(char c) {
        return (c >= '0' && c <= '9');
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值