题目描述
KeineDuck的衣服还没有寄过来!闲暇之余,她只好数一数自家的后院里还有多少颗蒜。
KeineDuck家的后院有很多块地,每块地都有一定数量的大蒜。为了使这件事情更富有挑战性,她打算将它们组成一个表达式——一个仅由加号、减号、乘号、除号、括号以及数字的表达式。它的计蒜方式满足我们日常生活中的运算规律——即括号内优先,其次乘法和除法,最后加法和减法。每个都是从左到右计蒜的。
但KeineDuck是个比较单纯的女孩子,因此除法要看成向下取整。比如说,6÷3=2,5÷2=2,10÷11=0。
现在请你帮助她,算出表达式的结果。
KeineDuck家的后院有很多块地,每块地都有一定数量的大蒜。为了使这件事情更富有挑战性,她打算将它们组成一个表达式——一个仅由加号、减号、乘号、除号、括号以及数字的表达式。它的计蒜方式满足我们日常生活中的运算规律——即括号内优先,其次乘法和除法,最后加法和减法。每个都是从左到右计蒜的。
但KeineDuck是个比较单纯的女孩子,因此除法要看成向下取整。比如说,6÷3=2,5÷2=2,10÷11=0。
现在请你帮助她,算出表达式的结果。
输入
第一行一个整数n,意为表达式的长度。
第二行一个字符串,表示要计蒜的表达式。
为了方便选手做题,我们有以下限制:
• 没有多余的空格和括号。
• 开头和嬨之后一定只会出现数字。
• 乘法只会用∗来连接,不会出现()()的形式。
第二行一个字符串,表示要计蒜的表达式。
为了方便选手做题,我们有以下限制:
• 没有多余的空格和括号。
• 开头和嬨之后一定只会出现数字。
• 乘法只会用∗来连接,不会出现()()的形式。
输出
一行一个整数,表示表达式的结果
样例输入 Copy
7
1+2*3/4
样例输出 Copy
2
提示
样例解释:2*3/4向下取整为1,所以1+1=2。
对于20%的数据,只有一个符号。
对于另外20%的数据,只有加法或减法。
对于另外20%的数据,没有括号。
对于100%的数据,表达式的长度不超过300,所有数字不超过1000,最后结果以及中间过程
的值不会超过1,000,000,000。
对于20%的数据,只有一个符号。
对于另外20%的数据,只有加法或减法。
对于另外20%的数据,没有括号。
对于100%的数据,表达式的长度不超过300,所有数字不超过1000,最后结果以及中间过程
的值不会超过1,000,000,000。
#pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; //c(n,k)*c(m,k)*k! inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } const int maxn=1e5+10; const int mod=1e9+7; stack<char>c; stack<int>v; int n; char a[1000]; char s[1001]; int cnt,val[1001]; int check(char a,char b){ if(a=='('||b=='('){ return 0; } if(a=='+'||a=='-'){ return 1; } if(a=='*'&&(b=='*'||b=='/')){ return 1; } if(a=='/'&&(b=='*'||b=='/')){ return 1; } return 0; } int dd(int x,char p,int y){ if(p=='+'){ return x+y; } else if(p=='-'){ return x-y; } else if(p=='*'){ return x*y; } else{ return x/y; } } int main(){ memset(s,0,sizeof(s)); cin>>n; scanf("%s",a); a[n]=')'; c.push('('); cnt=0; int i=0; while(i<=n){ if(a[i]>='0'&&a[i]<='9'){ int x=0; while(a[i]>='0'&&a[i]<='9'){ x=x*10+(a[i]-'0'); i++; } val[cnt++]=x; } else{ if(a[i]==')'){ while(!c.empty()&&c.top()!='('){ s[cnt++]=c.top(); c.pop(); } c.pop(); } else{ while(!c.empty()&&check(a[i],c.top())){ s[cnt++]=c.top(); c.pop(); } c.push(a[i]); } i++; } } for(i=0;i<cnt;i++){ if(!s[i]){ v.push(val[i]); } else{ int y=v.top(); v.pop(); int x=v.top(); v.pop(); v.push(dd(x,s[i],y)); } } printf("%d",v.top()); }