P1981 表达式求值

题目描述

给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。

输入输出格式

输入格式:

输入文件为 expr.in。

输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘

法运算符“*”,且没有括号,所有参与运算的数字均为 0 到 2^31-1 之间的整数。输入数据保

证这一行只有 0~ 9、+、*这 12 种字符。

输出格式:

输出文件名为 expr.out。

输出只有一行,包含一个整数,表示这个表达式的值。注意:当答案长度多于 4 位时,

请只输出最后 4 位,前导 0 不输出。

输入输出样例

输入样例#1: 复制
1+1*3+4
输出样例#1: 复制
8
输入样例#2: 复制
1+1234567890*1
输出样例#2: 复制
7891
输入样例#3: 复制
1+1000000003*1
输出样例#3: 复制
4

说明

对于 30%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100;

对于 80%的数据,0≤表达式中加法运算符和乘法运算符的总数≤1000;

对于 100%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100000。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#include<string>
using namespace std;

const int N=1e6+5;

char s[N];
int num,ans;
stack<int> A;
stack<char> B;
int main()
{
//    freopen("testdata.in","r",stdin);
    int a,b;
    char c;
    scanf("%s",s);
    int len=strlen(s);
    for(int i=0;i<len;++i)
    {
        if(isdigit(s[i]))
        {
            num=0;
            while(isdigit(s[i]))
            {
                num=num*10+s[i]-'0';
                ++i;
            }
            num%=10000;
            A.push(num);
            --i;
        }
        else if(s[i]=='*')
        {
            ++i;
            num=0;
            while(isdigit(s[i]))
            {
                num=num*10+s[i]-'0';
                ++i;
            }
            num%=10000;
            a=A.top(),A.pop();
            num*=a;
            num%=10000;
            A.push(num);
            --i;
        }
    }
    while(!A.empty())
    {
        ans+=A.top();
        A.pop();
    }
    printf("%d",ans%10000);
    return 0;
}
原文地址:https://www.cnblogs.com/lovewhy/p/8682886.html