题解 | #表达式求值#

表达式求值

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

#include <iostream>
#include <string>
#include <stack>
#include <queue>
#include <vector>
#include<algorithm>
using namespace std;
//处理无括号后的运算 含“s”标记符
int helper(vector<string> rec){
    vector<string> rec1,rec2;
    //去除“s”标记符
    for(int i=0;i<rec.size();i++){
        if(rec[i]!="s"){
            rec1.push_back(rec[i]);
        }  
    }
    //先乘除        
    for(int i=0;i<rec1.size();i++){        
        if(rec1[i]=="*" || rec1[i]=="/"){
            int left=stoi(rec2[rec2.size()-1]);
            int right=stoi(rec1[i+1]);
            if(rec1[i]=="*"){
                rec2[rec2.size()-1]=to_string(left*right);
            }
            else{
                rec2[rec2.size()-1]=to_string(left/right);
            }
            i++;
        }
        else{
            rec2.push_back(rec1[i]);
        }
    }
    //后加减
    int l=stoi(rec2[0]);
    for(int i=1;i<rec2.size();i=i+2){
        if(rec2[i]=="+"){
            l+=stoi(rec2[i+1]);
        }
        else if(rec2[i]=="-"){
           l-=stoi(rec2[i+1]);
        }
    }
  
    return l;
}
      
 
int main() {
    string str;
    vector<string> rec;
    cin>>str;
    int begin=0;
    //数字分割
    for(int i=0;i<int(str.size());i++){
         if(!isdigit(str[i])){
             //负数处理
            if(!(str[i]=='-' && ( i==0 || str[i-1]=='(' ))){
                if(i>begin){
                    rec.push_back(str.substr(begin,i-begin)); 
                }
                string tem="";
                tem.push_back(str[i]);
                rec.push_back(tem);  
                begin=i+1;
            }
        }
    }
    
    if(begin<str.size()) rec.push_back(str.substr(begin));
    //括号处理
    stack <int> l;
    queue<pair<int,int>> r;
    for(int i=0;i<rec.size();i++){
          if(rec[i]=="("){
               l.push(i);
             }
          if(rec[i]==")"){
              r.push(make_pair(l.top(),i));
              l.pop();
           }
       }
    int left,right;
    while(!r.empty()){
           left=r.front().first;
           right=r.front().second;
           r.pop();
           vector<string> cur(rec.begin()+left+1,rec.begin()+right);
           rec[left]=to_string(helper(cur));
           for(int i=left+1;i<=right;i++){
               rec[i]="s";
           }
       }
    
    cout <<helper(rec);
}

应该属于最容易理解的思路,先分割提取各个运算单元,然后处理括号问题,最后各部分是无括号的加减乘除问题,从左往右 先乘除后加减即可。
全部评论

相关推荐

2025-12-28 16:32
重庆邮电大学 Java
程序员花海:1.技能放最后,来面试默认你都会,技能没啥用 2.实习写的看起来没啥含金量,多读读部门文档,包装下 接LLM这个没含金量 也不要用重构这种 不会给实习生做的 3.抽奖这个还是Demo项目,实际在公司里面要考虑策略,满减,触发点,触发规则 库存 之类的,不是这个项目这么简单 4.教育背景提前,格式为 教育背景 实习 项目 技能 自我评价
简历被挂麻了,求建议
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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