题解 | 四则运算

四则运算

https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e

#include <cctype>
#include <iostream>
#include <stack>
using namespace std;
int pos;
int compute(string &s){
    int num=0;
    char flag='+';
    stack<int>st;
    while (pos<s.size()) {
        if(s[pos]=='{'||s[pos]=='['||s[pos]=='('){
            pos++;
            num=compute(s);
        }
        //读取数字
        while (pos<s.size()&&isdigit(s[pos])) {
            num=num*10+s[pos]-'0';
            pos++;
        }
        //队列计算
        switch (flag) {
            case '+':{
                st.push(num);
                break;
            }
            case '-':{
                st.push(-num);
                break;
            }
            case '*':{
                int tmp=num*st.top();
                st.pop();
                st.push(tmp);
                break;
            }
            case '/':{
                int tmp=st.top()/num;
                st.pop();
                st.push(tmp);
                break;
            }
        }
        // 归零
        num=0;
        //结束内部循环
         if(s[pos]=='}'||s[pos]==']'||s[pos]==')'){
            pos++;
            break;
        }
        //进行移动
        flag=s[pos];
        pos++;
    
    }
    int count=0;
    while (!st.empty()) {
    count+=st.top();st.pop();
    }
    return count;
}
int main() {
    string s;cin>>s;
    pos=0;
    cout<<compute(s)<<endl;
}
// 64 位输出请用 printf("%lld")
#include <cctype>
#include <iostream>
#include<bits/stdc++.h>
#include <stack>
using namespace std;
int calculate(string &s){
    stack<int>nums;
    stack<char>ops;
    auto compute=[&](){
        if(nums.size()<2||ops.empty())return;
        int a=nums.top();nums.pop();
        int b=nums.top();nums.pop();
        char c=ops.top();ops.pop();
        switch(c){
            case '+':nums.push(a+b);break;
            case '-':nums.push(b-a);break;
            case '*':nums.push(b*a);break;
            case '/':nums.push(b/a);break;
        }
    };
    unordered_map<char,int>pro{{'+',1},{'-',1},{'*',2},{'/',2}};
    for(int i=0;i<s.size();i++){
        char c=s[i];
        if(isdigit(c)){
            int num=0;
            while (isdigit(s[i])) {
            num=num*10+(s[i]-'0');
            i++;
            }
            i--;
            nums.push(num);
        }
       else if(c=='('||c=='{'||c=='['){
            ops.push('(');
        }

        else if(c=='+'||c=='-'||c=='*'||c=='/'){
            if(c=='-'&&(s[i-1]=='('||s[i-1]=='{'||s[i-1]=='['||i==0)){
                nums.push(0);
            }
            while(!ops.empty()&&ops.top() != '('&&pro[c]<=pro[ops.top()]){
                compute();
            }
            ops.push(c);
        }
        else if(c==')'||c=='}'||c==']'){
            while(!ops.empty()&&ops.top()!='('){
                compute();
            }
            if(!ops.empty())ops.pop();
        }
    }
    while(!ops.empty())compute();
    return nums.top();
}

int main() {
    string s;
    while (cin >> s) { // 注意 while 处理多个 case
        cout<<calculate(s);
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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