表达式求值
描述
给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。
格式
输入格式
输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘法运算符“*”,且没有括号,所有参与运算的数字均为 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;
}