HJ50-四則演算

トピック

式 (文字列で表される) を入力し、この式の値を見つけます。
保証された文字列の有効な文字には、['0'-'9']、'+'、'-'、'*'、'/'、'('、')'、'['、']'、' {','}'. そして、その式は正当なものでなければなりません。

データ範囲

|val|<=100、文字列の長さ n は 1<=n<=1000 を満たす

入出力

式を入力して計算結果を取得します

プログラム

#include <cctype>
#include <iostream>
#include<cctype>
#include<cstring>
#include<stack>
using namespace std;
void compute(stack<int>&st1,stack<char>&st2){
    
    
    int b=st1.top();
    st1.pop();
    int a=st1.top();
    st1.pop();
    char op=st2.top();
    st2.pop();
    if(op=='+') a=a+b;
    else if(op=='-') a=a-b;
    else if(op=='*') a*=b;
    else if(op=='/') a/=b;
    st1.push(a);
}
bool priority(char m,char n){
    
    
    if(m=='(') return false;
    else if((m=='+'||m=='-')&&(n=='*'||n=='/')) return false;
    return true;
}
int main() {
    
    
    string str;
    while (getline(cin,str)) {
    
     // 注意 while 处理多个 case
       stack<int>num;
       stack<char>op;
       op.push('(');
       str+=')';
       bool flag=false;
       for(int i=0;i<str.size();i++){
    
    
        if(str[i]=='('||str[i]=='['||str[i]=='{') op.push('(');
        else if(str[i]==')'||str[i]==']'||str[i]=='}'){
    
    
            while(op.top()!='('){
    
    
                compute(num, op);
            }
            op.pop();
        }else if(flag){
    
    
            while (priority(op.top(),str[i])) {
    
    
                compute(num, op);
            
            }
            op.push(str[i]);
            flag=false;
        }else{
    
    
            int j=i;
            if(str[i]=='-'||str[i]=='+') i++;
            while(isdigit(str[i])) i++;
            string tmp=str.substr(j,i-j);
            num.push(stoi(tmp));
            i--;
            flag=true;
        }
       }
       cout<<num.top()<<endl;
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/qaaaaaaz/article/details/130204782