洛谷 P1981 表达式求值
题目描述
给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。
输入输出格式
输入格式:
输入文件为 expr.in。
输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘
法运算符“*”,且没有括号,所有参与运算的数字均为 0 到 2^31-1 之间的整数。输入数据保
证这一行只有 0~ 9、+、*这 12 种字符。
输出格式:
输出文件名为 expr.out。
输出只有一行,包含一个整数,表示这个表达式的值。注意:当答案长度多于 4 位时,
请只输出最后 4 位,前导 0 不输出。
输入输出样例
说明
对于 30%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100;
对于 80%的数据,0≤表达式中加法运算符和乘法运算符的总数≤1000;
对于 100%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100000。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define mod 10000 #define MAXN 1000010 using namespace std; int tmp[MAXN]; int top1,top2,len; char s[MAXN],bns[MAXN]; long long stack1[MAXN]; void work(){ int m1=stack1[top1],n1=stack1[top1-1]; top1--; if(bns[top2]=='+') stack1[top1]=(n1%mod+m1%mod)%mod; else if(bns[top2]=='*') stack1[top1]=(n1%mod*m1%mod)%mod; top2--; } int main(){ tmp[43]=2;tmp[42]=1; scanf("%s",s); len=strlen(s); long long num=0; for(int i=0;i<len;i++){ if(s[i]>='0'&&s[i]<='9') num=num*10+s[i]-'0'; else{ if(num!=0){ stack1[++top1]=num; num=0; } if(tmp[s[i]]<tmp[bns[top2]]) bns[++top2]=s[i]; else{ while(tmp[s[i]]>=tmp[bns[top2]]&&top2>0) work(); bns[++top2]=s[i]; } } } if(num!=0){ stack1[++top1]=num;num=0; } while(top2>0) work(); cout<<stack1[1]%mod; }
#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<string> using namespace std; int main() { long long shu,sum=0,cj,sg;//记得sum初始值赋为0;cj为其中一段运算(即一段连续的乘积)的值 char ch=0,xg;//ch存储上一个运算符,xg为新读入的运算符 bool tf=true; while(tf) { scanf("%lld",&shu); tf=scanf("%c",&xg)==1?true:false;//如果下一个没有运算符了,则tf=false,既保证了此次循环的正常运行,又能在下一遍循环跳出 if(ch==0)cj=shu;//如果是刚开始读入,则直接赋值 if(ch=='+')sum=(sum+cj)%10000,cj=shu;//如果上一个操作是加法,则将前一段的值加入到sum中,然后再更新此新段的值 if(ch=='*')cj=(cj*shu)%10000;//如果上一个运算仍是乘法,则将此数乘入本段的值中 if(!tf)sum=(sum+cj)%10000;//如果是最后一个元素,则进行最后的更新 ch=xg;//将下一个读入的运算符作为新的一个循环的上一个运算符,并继续循环 } printf("%lld",sum);//输出 return 0; }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。