题解 | 表达式求值

import java.util.*;

/**
 * NC137 表达式求值
 * @author d3y1
 */
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * 相似 -> NC240 计算器(一)   [nowcoder]
     * 相似 -> NC241 计算器(二)   [nowcoder]
     * 相似 -> HJ50 四则运算      [nowcoder]
     *
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    public int solve (String s) {
        int n = s.length();
        if(n == 0){
            return 0;
        }

        Stack<Integer> stack = new Stack<>();

        char sign = '+';
        int num;
        char ch;
        for(int i=0; i<n; i++){
            num = 0;
            ch = s.charAt(i);

            // 数字
            if(Character.isDigit(ch)){
                num = num*10+(ch-'0');
                while(++i < n){
                    ch = s.charAt(i);
                    if(Character.isDigit(ch)){
                        num = num*10+(ch-'0');
                    }else{
                        break;
                    }
                }
            }

            // 括号 -> 递归
            if(ch == '('){
                int cnt = 1;
                int j;
                for(j=i+1; j<n; j++){
                    ch = s.charAt(j);
                    if(ch == '('){
                        cnt++;
                    }
                    else if(ch == ')'){
                        cnt--;
                    }
                    if(cnt == 0){
                        num = solve(s.substring(i+1, j));
                        break;
                    }
                }
                i = j+1;
            }

            // 运算符
            switch(sign){
                case '+': stack.push(num); break;
                case '-': stack.push(-num); break;
                case '*': stack.push(stack.pop()*num); break;
                case '/': stack.push(stack.pop()/num); break;
                default: break;
            }

            if(i == n){
                break;
            }else{
                sign = s.charAt(i);
            }
        }

        int result = 0;
        while(!stack.isEmpty()){
            result += stack.pop();
        }

        return result;
    }
}

全部评论

相关推荐

苗条的伊泽瑞尔最喜欢...:同28届被压力了,电科✌就不能去卷算法吗?把Java留给我们双非卷
投递快手等公司10个岗位
点赞 评论 收藏
分享
Jcwemz:中软证书写单行,考了什么学了什么相关技术栈的内容就说自己会什么, 没实习就包装实习简历,将项目经历写成实习做的,项目时间拉长,项目成果具体化,测试的项目成果无非就是写了多少用例查出了多少bug,重要的不是实习了多久,而是你会多少东西,你能表达的就都是你的。 cet4,随便找个地方标上就好了,不用写单行。 粗略建议,我也不在行,觉得对的可以采纳
实习,投递多份简历没人回...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务