竟然可以用队列

· · 题解

题目大意

计算表达式的值。

解法:

动态数组计算 。

定义两个动态数组,存储各个运算过程中的数和预算过程中的符号。

详细版:

遇到乘在第二个动态数组记1,否则记0

当遇到数字,字符串转数字,方法不再赘述。

遍历两遍,第一遍直接忽视加号,以防遇到这样的强数据:3+2*6

当遍历到乘号,即 1 时,直接将形如 a * b 的形式转为 0+a * b (并求出结果)

遍历完成后,将所有项求和,即可得到答案。

注意:这不完全适用本题,仅为“正确”答案,本题需模10000

AC代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    string n;
    cin>>n;
    vector<int>shu;
    vector<int>fh;
    int x=n.length(),wz=0,z=0;
    for(int i=0;i<x;i++){
        if(n[i]=='+'||n[i]=='*'){
            shu.push_back(z);
            z=0;
            if(n[i]=='+'){
                fh.push_back(0);
            }else{
                fh.push_back(1);
            }
            wz++;
        }else{
            z*=10;
            z+=int(n[i])-int('0');
        }
    } 
    shu.push_back(z);
    for(int i=0;i<wz;i++){
        if(fh[i]==1){
            shu[i+1]*=shu[i];
            shu[i+1]%=10000;
            shu[i]=0;
            fh[i]=0;
        }
    }
    for(int i=0;i<wz;i++){
        shu[i+1]+=shu[i];
        shu[i+1]%=10000;
        shu[i]=0;
    }
    cout<<shu[wz]%10000<<endl;
}