题解 | #表达式求值#逆波兰表达法求解

这道题做了好久,看到没有C语言题解咱就写一下,欢迎优化指正OvO- - 本解法采用逆波兰表达式求解,前半段是将中缀表达式变换成后缀表达试(逆波兰表达式) 关于逆波兰表达式大家可以百度知乎一下,算法入门里面也有逆波兰表达式的题,感觉用逆波兰算长表达式是真滴好使- -。 代码如下,大家应该都可以看懂,要注意的是数组下标的值一定要仔细!!还有一点要注意的就是当逆波兰表达式中出现连续的减号时,除了第一个减号剩余减号都要转换成加号,下面也有对应代码注解。如当遇到1-2-3-4时,第一部分变换的表达式时1,2,3,4,-,-,-,但由于有连续减号所以我们需要加一步变换->逆波兰表达式:1,2,3,4,-,+,+, 但如果遇到1-(2-3)的情况由于有()减号没有形成连续的减号所以就可以直接进行运算啦->逆波兰表达式:1,2,3,-,-。

int solve(char* s ) {
    int topIdx=0;
    char operator[100]={0};
    char temp[100][10]={0};
    int m=0,j=0;
    //******************逆波兰转换,将中缀表达式转换成后缀表达式***********
    int len=strlen(s);
    for(int i=0;i<len;i++){
        if(s[i]=='*'||s[i]=='('){
            operator[topIdx++]=s[i];
        }
         else if(s[i]=='+'||s[i]=='-'){
            if(operator[topIdx-1]=='*'){
                while(operator[--topIdx]!='('&&topIdx>=0)
                    temp[j++][0]=operator[topIdx];
                operator[++topIdx]=s[i];
                topIdx++;
            }
            else
                operator[topIdx++]=s[i];
            }
        else if(s[i]==')'){
            while(operator[--topIdx]!='('&&topIdx>=0)
                temp[j++][0]=operator[topIdx];
        }
     
        else{
            temp[j][m++]=s[i];
            if((s[i+1]<'0'||s[i+1]>'9')&&i<len-1){
                j++;
                m=0;
            }
            else if(i==len-1)
                j++;
        }
    }
     
    for(int i=0,j=1;i<topIdx;i++){
        if(operator[i]=='-')
            while(operator[i+j]=='-'&&(i+j)<topIdx)
                operator[i+j++]='+';
    }
     
     
    int lenoftemp=0;
    if(topIdx!=0){
        for(int i=topIdx-1;i>=0;i--)
            temp[j++][0]=operator[i];
        lenoftemp=j;
    }
     
     //**************用逆波兰表达式求解最终结果***********
    int result=0;
    int integer[100];
   // int *integer=(int *)malloc(sizeof(int)*lenoftemp);
    for(int i=0,topIdx=0;i<lenoftemp;i++){
        if(strcmp(temp[i],"+")==0){
            result=integer[topIdx-2]+integer[topIdx-1];
            topIdx--;
            integer[topIdx-1]=result;
        }
        else if(strcmp(temp[i],"*")==0){
            result=integer[topIdx-2]*integer[topIdx-1];
            topIdx--;
            integer[topIdx-1]=result;
        }
        else if(strcmp(temp[i],"-")==0){
            result=integer[topIdx-2]-integer[topIdx-1];
            topIdx--;
            integer[topIdx-1]=result;
        }
        else
            integer[topIdx++]=atoi(temp[i]);
    }
     
    return integer[0];
}
全部评论
个人理解:这一段是为了将这个操作数字符(可能不止一个)读完,这也就印证了前面定义temp时列数是10,即操作数的位数!
点赞 回复 分享
发布于 2024-02-24 11:41 四川
else { temp[j][m++] = s[i]; if ((s[i + 1] < '0' || s[i + 1] > '9') && i < len - 1) { j++; m = 0; } else if (i == len - 1) j++; } 这一段怎么理解?为啥会涉及到m
点赞 回复 分享
发布于 2023-04-13 19:18 广东

相关推荐

面试官人很好!!!刚开始面试的时候其实超级超级紧张,但是面试官会诱导我回答,越聊越轻松。无算法无手撕。无自我介绍1.&nbsp;面试官自我介绍,给我介绍团队部门和业务(一个偏ToD基础设施,一个类claude)2.&nbsp;日常开发中你是怎么用ai的?3.&nbsp;你是怎么进行测试的?(tips:其实面试官从这里开始就想问我workflow,一直在诱导我回答)我:就是让ai编写一些测试脚本去处理正常情况和边界情况面:那你这样子每次手动让ai去编写测试代码不会很繁琐嘛?那如果现在已经有了一个相关的Skill你会怎么用他?我:(叽里呱啦一大堆,我大概讲了一下这个skill应该做什么事情,讲了讲渐进式加载skill)面:那你能确保这个skill一定能执行嘛?我:我们可以用workflow,主流程固定,节点任务交给agent或者llm面:我想听的就是这个,那workflow怎么用呢?我:这确实不知道面:我们可以把workflow写到system&nbsp;prompt中4.&nbsp;你用ai到现在花了多少钱?(一分钱没花,这里还唠了一会)5.&nbsp;项目中的打字机效果是怎么实现的?6.&nbsp;打字机的帧率是多少,是怎么计算的?7.&nbsp;markdown渲染你有没有什么安全措施?怎么防XSS(gfm白名单)8.&nbsp;CSFR攻击9.&nbsp;为什么要用SSE做ai输出,不用websocket?10.&nbsp;项目:ai生成歌曲肯定需要一定的事件,你怎么让用户等待更加舒畅?11.&nbsp;等待进度条的当前task是怎么做的?(SSE&nbsp;自定义事件)12.&nbsp;为什么播放器要全局状态管理?13.&nbsp;假设我现在要做一个效果,就是根据音乐有音波的震动感,你会怎么做,谈谈思路就可以。我:1.用现成的库。2.每隔0.5s或者固定时间对某个节点进行分析音乐特征作为主波频,小波频可以用噪声模拟。面:音乐文件是可以解析成数组的,里面有音乐相关的特征信息(感觉运气很好啊,因为面试官也做过类似的项目所以比较感兴趣)14.&nbsp;为什么你的项目要用Next.js,这里我吐槽了一波SSR很恶心,很多浏览器的api都不能用,面试官告诉我那就是SSR用的地方不对,确实醍醐灌顶了,有高交互的地方确实不应该也不适合使用SSR15.&nbsp;你知道哪些性能指标呢?你是怎么监测的呢?16.&nbsp;&nbsp;我看你简历上写了擅长性能优化,跟我说说你怎么做的吧。(因为我们的服务器很差,我做了超级多的性能优化,我个人觉得这里答得蛮不错的,面试官说很少人会写这个,答出来会很加分)17.&nbsp;还有一些个别问题吧,刚开始的时候太紧张了,确实不记得了录音了。。。18.&nbsp;你觉得ai会取代前端嘛?19.&nbsp;你说你更喜欢美学和设计之类的,你了解过哪些动画库或者UI库嘛?20.&nbsp;通知一面过了(真的开心坏了哈哈哈哈哈哈哈)反问:1.&nbsp;如果能顺利通过面试的话,老师您更推荐我去哪个部门?2.&nbsp;大厂的开发流程协作模式是怎么样的?3.&nbsp;我现在用ai有个问题,日常开发中使用ai,如果代码是ai写的我会有深深的愧疚感,但是又不能不用。用了ai写代码,代码能力就慢慢地下降了,导致进一步使用ai,形成恶性循环,不知道老师您是怎么看的?(随个简历和下一场面试邀请)
晨时念:羡慕期待明天我也是这样
点赞 评论 收藏
分享
评论
18
收藏
分享

创作者周榜

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