求解字符串的运算结果(包含括号+-*/)逆波兰式(后缀式)基本步骤

1、需要两个栈(结果String栈s1和Character辅助栈s2)

2、定义优先级( + - *  /  优先级分别0 1 1 2 2

3、遍历字符串s‘

        1、如果是数字,加入s1;

         否则:

      2、if 如果s2为空

                  或者是左括号“(”  

                 或者 如果当前字符优先级大于栈顶优先级

                //(可类比记忆,当栈顶为左括号的时候,肯定加入,加入的优先级肯定高于栈顶){

                        当前字符入栈s2

}

         else if 不然是右括号‘)’的话,不断while循环把栈里面‘(’之后的全部加入到s1;(括号不用加入){                    

                        while (st2.peek() != '(') {
                            st1.push(st2.pop() + ""); //弹出运算符栈
                               }
                        st2.pop(); //弹出左括号

}

        else  当辅助栈s2不空的时候,如果当前字符的优先级小于等于栈顶的优先级,不断把辅助栈里面的s2元素放到s1里面。最后记得把当前元素放到辅助栈里面。{

        while (!st2.isEmpty()&&getPriority(c)<=getPriority(st2.peek())) {
            st1.push(st2.pop() + "");
        }
        st2.push(c);

}

      //遍历完以后辅助栈的全部放过去

public static String[] transToExpress(String s) {
        // 数字直接入 表达式栈,符号先入辅助栈(后续遍历二叉树)。
        Deque<String> st1 = new LinkedList<>();  //逆波兰表达式站
        Deque<Character> st2 = new LinkedList<>();     //辅助栈
        int i = 0;
        while (i < s.length()) {
            if (Character.isDigit(s.charAt(i))) {  // 如果是数字
                int index = i;
                while (i < s.length() && Character.isDigit(s.charAt(i)))
                    i++;
                st1.push(s.substring(index, i));
            } else {

                char c = s.charAt(i);
                if (c == '(' || st2.isEmpty() || getPriority(c) > getPriority(st2.peek())) {
                    st2.push(c);
                } else if (c == ')') {
                    while (st2.peek() != '(') {
                        st1.push(st2.pop() + ""); //弹出运算符栈
                    }
                    st2.pop(); //弹出左括号
                } else {
                    while (!st2.isEmpty() && getPriority(c) <= getPriority(st2.peek())) {
                        st1.push(st2.pop() + "");
                    }
                    st2.push(c);
                }
                i++;
            }

        }
        while (!st2.isEmpty()) {      //遍历完以后辅助栈的全部放过去
            st1.push(st2.pop() + "");
        }



        //无关
        int j = st1.size() - 1;
        String[] res = new String[st1.size()];
        while (!st1.isEmpty()) {
            res[j--] = st1.pop();
        }
        return res;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值