主要是对于表达式处理算法的概念比较模糊,类比应用起来不是很顺,一开始把想把数值栈给省略只用O(1)的空间储存结果,结果发现有问题,迟迟没有下手。
这两天复习了一下表达式处理算法,逃了一天晚自习回家轻松的AC了此题。
在导刊上看到SHUXK牛的题解,是基于分治算法,利用手工栈解决的。一方面我们可以肯定他作为初三同学的高超水平。
另一方面,我们可以思考,对于在考场上果断分治90分是很好的,但进而用手工栈来AC的话,还不如使用正解的算法。
思路不想说了,表达式处理的基本算法和简单的统计知识。
AC代码
#include<cstdio>
#include<cstring>
const int mod=10007;
char exp[100005];
int n;
int stacka[100005],stackb[100005];
char stackc[100005];
int stab=0,stc=0;
void dorp();
int main(){
freopen("exp.in","r",stdin);
freopen("exp.out","w",stdout);
scanf("%d ",&n);
for(int i=1;i<=n;i++)
scanf("%c ",&exp[i]);
stab++;
stacka[stab]=stackb[stab]=1;
for(int i=1;i<=n;i++){
if(exp[i]=='+'){
while(stc&&stackc[stc]=='*')
dorp();
stc++;
stackc[stc]='+';
stab++;
stacka[stab]=stackb[stab]=1;
}
if(exp[i]=='*'){
stc++;
stackc[stc]='*';
stab++;
stacka[stab]=stackb[stab]=1;
}
if(exp[i]=='('){
stc++;
stackc[stc]='(';
stab++;
stacka[stab]=stackb[stab]=1;
}
if(exp[i]==')'){
while(stc&&stackc[stc]!='(')
dorp();
dorp();
}
}
while(stc)
dorp();
printf("%d ",stacka[1]);
fclose(stdin);
fclose(stdout);
return 0;
}
void dorp(){
int a,b;
if(stackc[stc]=='+'){
a=stacka[stab]*stacka[stab-1];
b=stackb[stab]*stackb[stab-1]+stacka[stab]*stackb[stab-1]+stackb[stab]*stacka[stab-1];
}
if(stackc[stc]=='*'){
a=stacka[stab]*stacka[stab-1]+stacka[stab]*stackb[stab-1]+stackb[stab]*stacka[stab-1];
b=stackb[stab]*stackb[stab-1];
}
a%=mod;
b%=mod;
stacka[stab-1]=a;
stackb[stab-1]=b;
stc--;
stab--;
}