算数表达式去括号(只包含加减)

本文介绍了如何处理只包含加减运算的算数表达式,通过递归去括号方法,将表达式简化。接着,利用Map统计每个字母(a-z)正负出现的次数,进行相等性比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来源

原题来自腾讯WXG,比较两个算数表达式是否相等(只包含26个字母,只有加减)。

思路:

我的想法为先去括号,再用一个Map去统计每个字母(a-z)正负相消后的的个数(字母前面为’+‘就加一,为’-'就减一)。比如,a-a+a-b最终就是a:1, b:-1, 最终比较每个字母的计数。

递归去括号过程

public static void main(String[] args) {
    String exp = "a-(b-(e-f)+c)";
    String ret = removeKH(exp);
    System.out.println(ret);
}

public static String removeKH(String exp){
    StringBuilder ans = new StringBuilder();
    for (int i = 0; i < exp.length(); i++) {
        if (exp.charAt(i)!='(')
            ans.append(exp.charAt(i));
        else {
            i = helper(i+1, exp, ans);
        }
    }
    return ans.toString();
}
public static int helper(int idx, String exp, StringBuilder ans){
    if (ans.charAt(ans.length()-1)=='-'){
        //括号前-
        while (exp.charAt(idx)!=')'){
            switch (exp.charAt(idx)){
            case '-':
                ans.append('+');
                break;
            case '+':
                ans.append('-');
                break;
            case '(':
                idx = helper(idx, exp, ans);
                break;
            default:
                ans.append(exp.charAt(idx));
                break;
            }
            ++idx;
        }
    }
    else {
        idx++;
        while (exp.charAt(idx)!=')'){
            switch (exp.charAt(idx)){
            case '(':
                idx = helper(idx, exp, ans);
                break;
            default:
                ans.append(exp.charAt(idx));
                break;
            }
            ++idx;
        }
    }
    return idx;
}

输出

a-b+e-f-c
说明 很久就想编一个这样的计算器,只可惜一直没什么思路,最近突然灵感来了,所以就写下 这个程序。现在还在测试阶段,所以功能不是很完善。 程序功能:基本的表达式运算,可以自定义函数跟常量,分别保存在 “常数.txt” 和 “函数.txt”,方便自己添加。双击相应的函数名或常数名就可以将函数或常量添加到表达式中。 计算过程只能当表达式只有一行时有效。 实例1:计算sqr(19+tan(98)*tan(91)-sin(122)*(5*5-(19-11)))/2 计算过程sqr(19+tan(98)*tan(91)-sin(122)*(5*5-(19-11)))/2 =sqr(19+-7.11536972238419*tan(91)-sin(122)*(5*5-(19-11)))/2 =sqr(19+-7.11536972238419*-57.2899616307588-sin(122)*(5*5-(19-11)))/2 =sqr(19+-7.11536972238419*-57.2899616307588-.848048096156426*(5*5-(19-11)))/2 =sqr(19+-7.11536972238419*-57.2899616307588-.848048096156426*(5*5-8))/2 =sqr(19+-7.11536972238419*-57.2899616307588-.848048096156426*17)/2 =20.3032618253667/2 =10.1516309126834 实例2:计算 a=34 b=55 c=a+1 圆的面积(c) a*b c=a+b 圆的面积(c) 以下是计算结果: 圆的面积(c)=3848.4510006475 a*b=1870 圆的面积(c)=24884.5554090847 内置函数: !(x) - x 的阶乘 lg(x),log(x) 以10为底的对数 ln(x) 以 e为底x的对数 pow(x,y) x的y方次幂 prime(x) 判定x是否是素数,如果是直接将s2返回,否则将其各因子用连乘返回 sqr(x),sqrt(x) - x 的二次方根 arcsin(x) - x 的反正弦 arccos(x) - x 的反余弦 arcsec(x) - x 的反正割 arccsc(x) - x 的反余割 atn(x),arctg(x) - x 的反正切 arcctg(x) - x 的反余切 sin(x) - x 的正弦 cos(x) - x 的余弦 sec(x) - x 的正割 csc(x) - x 的余割 tg(x),tan(x) - x 的正切 ctg(x) - x 的余切 harcsin(x) - x 的反双曲正弦 harccos(x) - x 的反双曲余弦 harcsec(x) - x 的反双曲正割 harccsc(x) - x 的反双曲余割 harctg(x),harctan(x) - x 的反双曲正切 harcctg(x) - x 的反双曲余切 hsin(x) - x 的双曲正弦 hcos(x) - x 的双曲余弦 hsec(x) - x 的双曲正割 hcsc(x) - x 的双曲余割 htg(x),htan(x) - x 的双曲正切 hctg(x) - x 的双曲余切 有什么意见或建议可以跟我联系Email: ldm.menglv@gmail.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值