题解 | 表达式求值

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    public int solve (String s) {
        String[] dateArr = s.split("");
        Stack<String> dealStack = new Stack<>();

        for (String s1 : dateArr) {
            if (s1.equals(")")) {
                String compute = "";
                while (!dealStack.isEmpty()) {
                    String pop = dealStack.pop();
                    if (pop.equals("(")) {
                        Integer i = computeData(compute);
                        dealStack.push(i + "");
                        break;
                    } else {
                        compute = pop + compute;
                    }
                }
            } else {
                dealStack.push(s1);
            }
        }
        String res = "";
        while (!dealStack.isEmpty()) {
            res = dealStack.pop() + res;
        }
        return computeData(res);
    }

    public int computeData(String data) {
        String[] split = data.split("");
        List<Object> dataRes = new ArrayList<>();

        int preI = 0;
        String pre = "";
        Integer prex = null;
        for (int i = 0; i < split.length; i++) {
            String s = split[i];
            if (s.equals("*")) {
                String add = data.substring(preI, i);
                if (prex != null) {
                    prex = new Integer(add) * prex;
                } else  {
                    prex = new Integer(data.substring(preI, i));
                }
                preI = i + 1;
            } else if (s.equals("-")) {
                if (i==0) {
                    continue;
                }
                if (pre.equals("-") || pre.equals("+") || pre.equals("*")) {
                    preI = i;
                } else {
                    String add = data.substring(preI, i);
                    if (prex != null) {
                        dataRes.add(new Integer(add) * prex);
                        prex = null;
                    } else  {
                        dataRes.add(add);
                    }
                    dataRes.add("-");
                    preI = i + 1;
                }

            } else if (s.equals("+")) {
                String add = data.substring(preI, i);
                if (prex != null) {
                    dataRes.add(new Integer(add) * prex);
                    prex = null;
                } else  {
                    dataRes.add(add);
                }
                dataRes.add("+");
                preI = i + 1;
            }
            if (i == split.length - 1) {
                String add = data.substring(preI, i + 1);
                if (prex != null) {
                    dataRes.add(prex * new Integer(add));
                    prex = null;
                } else {
                    dataRes.add(add);
                }

            }
            pre = s;
        }

        Integer ust = 0;
        Iterator<Object> iterator = dataRes.iterator();
        while (iterator.hasNext()) {
            Object next = iterator.next();
            if (next.equals("+")) {
                ust = ust + new Integer(iterator.next() + "");
            } else if (next.equals("-")) {
                ust = ust - new Integer(iterator.next() + "");
            } else {
                ust = new Integer(next.toString());
            }
        }
        return ust;
    }
}

全部评论

相关推荐

2024-12-29 11:08
湖南工业大学 Java
程序员牛肉:简历没什么大问题了。 而且不要再换项目了。三月份就开暑期实习了,现在都一月份了。实在来不及重新开一下项目了。把一个项目写完或许很快,但是把一个项目搞懂吃透并不简单。所以不要换项目了,把你简历上面的两个项目好好挖一挖吧。 具体 体现在:你能不能流利的说出你的项目的每一个功能点代码实现?你能不能说出在这块除了A技术之外,还有其他技术能够实现嘛?如果有其他技术能够实现,那你这块为什么选择了你当前用的这个技术?
投递牛客等公司10个岗位
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务