表达式求值

表达式求值

描述

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

格式

输入格式

输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘法运算符“*”,且没有括号,所有参与运算的数字均为 0 到 2 ^ 31 -1 之间的整数。输入数据保证这一行只有 0~ 9、+、*这 12 种字符。

输出格式

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

样例1

样例输入1

1+1*3+4

样例输出1

8

样例2

样例输入2

1+1234567890*1

样例输出2

7891

样例3

样例输入3

1+1000000003*1

样例输出3

4

本来是一道简单题但是因为字符串空间开小了,导致一直测不过

最后将空间开到320000才终于全部测过

ac代码:

#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
int main()
{
    char ch[320050];
    stack<char>m1;//用来盛放操作符
    stack<long long>m2;//用来盛放操组数
    cin>>ch;
    long long len1=strlen(ch);
    long long m3=0;//m3的用处是用来处理多位数,例如12*34,在输入1以及3的时候不能直接插入到m2中,只有输入*以及表达式输入结束才能将m3当做一个多位数插入m2
    for(long long i=0;i<=len1;i++){
        if(i==len1){//此时输入结束,将最后一个整数插入m2
            m2.push(m3);
            if(m2.size()>=2&&m1.top()=='*'){
                long long m,n;
                m=m2.top();
                m2.pop();
                n=m2.top();
                m2.pop();
                m2.push((n*m)%10000);
                m1.pop();
            }
            break;
        }
        if(ch[i]>='0'&&ch[i]<='9'){
            m3=m3*10+(ch[i]-'0');
        }
        if(ch[i]=='+'||ch[i]=='*'){
            m2.push(m3);
            m3=0;
            if(m2.size()>=2&&m1.top()=='*'){//此时判断乘式是否满足,因为题目只要求了+*两种所以先将所有的*处理掉,最后处理+
                int m,n;
                m=m2.top();
                m2.pop();
                n=m2.top();
                m2.pop();
                m2.push((n*m)%10000);
                m1.pop();
            }
            m1.push(ch[i]);
        }
    }
    while(m1.size()){//此时m1中全部是+    挨个相加就行;
        long long m,n;
        m=m2.top();
        m2.pop();
        n=m2.top();
        m2.pop();
        m2.push((n+m)%10000);
        m1.pop();
    }
    cout<<m2.top()%10000<<endl;//m2现在应该只有一个结果即最后的结果
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值