题解 | #表达式求值#

表达式求值

https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d

解题思路:
1)中缀表达式转后缀表达式
2)依据后缀表达式计算
参考链接:
代码实现(2022-11-8 通过率:10/11):
针对表达式存在负数的情况,可以正常处理。解决思路是,检查负号‘-’是否为二元运算符,若不是,则将负号不入栈,而是拼接到单元运算数上。
比如:-1*(-1-1) => -1 -1 1 - *
package com.ihang.learn.java.huawei;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.Stack;

/**
 * @author yaohangyang
 * @date 2022/11/7
 */
public class HJ54 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) {
            // 注意 while 处理多个 case
            System.out.println(hj54(in.nextLine()));
        }
    }

    //中缀表达式转后缀表达式
    public static Deque<String> Mid2End(String str) {
        //用于存运算数
        StringBuilder number = new StringBuilder();
        //后缀表达式
        Deque<String> deque = new LinkedList<>();
        //运算操作符
        Stack<Character> stack = new Stack<>();
        boolean flag = false;
        for(int i = 0; i<str.length(); i++){
            char c = str.charAt(i);
            if(c>='0' && c<='9'){
                number.append(c);
            }else {
                if(number.length()>0){
                    if(flag){
                        deque.add("-"+number.toString());
                        flag = false;
                    }else {
                        deque.add(number.toString());
                    }
                    number.delete(0,number.length());
                }
               if(c=='('){
                   stack.push(c);
               }else if(c==')'){
                   char top = stack.peek();
                   while (top!='('){
                       deque.add(stack.pop()+"");
                       top = stack.peek();
                   }
                   stack.pop();
               }else if(c=='-' && (i==0 || str.charAt(i-1)=='(')){
                   // 用于处理运算数是负数的情况 比如:-1*(-1-1) => -1 -1 1 - *
                   flag = true;
               }else  {
                   if(stack.size()<=0 || stack.peek()=='(' || opeCompare(c,stack.peek())){
                       stack.push(c);
                   }else {
                       while (stack.size()>0 && stack.peek()!='(' && !opeCompare(c,stack.peek())){
                           deque.add(stack.pop()+"");
                       }
                       stack.push(c);
                   }
               }
            }
        }
        if(number.length()>0){
            deque.add(number.toString());
        }
        while (stack.size()>0){
            deque.add(stack.pop()+"");
        }

        return deque;
    }

    //运算符优先级比较
    public static  boolean opeCompare(char a ,char b){
        if(a=='*' || a=='/'){
            if(b=='+' || b=='-'){
                return true;
            }
        }
        return false;
    }

    //后缀表达式计算
    public static int hj54(String str){
        Deque<String> deque = Mid2End(str);
        Stack<Integer> stack = new Stack<>();
        while (deque.size()>0){
            String s = deque.pollFirst();
            if(s.charAt(s.length()-1)>='0' && s.charAt(s.length()-1)<='9'){
                stack.push(Integer.parseInt(s));
            }else {
                int b = stack.pop();
                int a = stack.pop();
                int r = 0;
                switch (s.charAt(0)){
                    case '*':
                        r = a*b;
                        break;
                    case '/':
                        r = a/b;
                        break;
                    case '+':
                        r = a+b;
                        break;
                    case '-':
                        r = a-b;
                        break;
                    default:
                        break;
                }
                stack.push(r);
            }
        }
        return stack.pop();
    }
}



全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务