2017.5.6 表达式的值 思考记录

来源:互联网 发布:exe软件代码修改 编辑:程序博客网 时间:2024/06/06 02:11

        这个题严重不符普及组的身份、、虽然是模拟,但如果想不清楚是很难入手的

        首先判断哪个位置有数,肯定先找运算符、、

       这是其实只用看这一个符号和上一个符号,害怕遗漏的话可以罗列一下:

        (+   :  +号前一定有数    

         )+ :  +号前一定没有数

         + +:  +号前一定有数

          * +:  +号前一定有数

         

         所以只要+号前不是)就有数

       而且要考虑运算符后面的,就需要对右括号进行同“+”的处理,不同的是这个右括号要一直推到左括号


       用运算符优先级的方法建立两个栈处理运算::能放就放,如果+号前是*号就一直把*法做完、


码:

#include<iostream>#include<cstdio>using namespace std;int n,i,shucnt,fucnt;char ch[100006],fu[100006];struct oo{int yi,ling;}zhan[100006];int main(){scanf("%d",&n);for(i=1;i<=n;i++){scanf("%c",&ch[i]);while(ch[i]=='\n')scanf("%c",&ch[i]);}ch[0]='(';ch[++n]=')';for(i=0;i<=n;i++){if(ch[i]=='+'){if(ch[i-1]!=')'){    ++shucnt;zhan[shucnt].ling=1;zhan[shucnt].yi=1;    }while(fu[fucnt]=='*'){--fucnt;--shucnt;int linling=(zhan[shucnt].yi*zhan[shucnt+1].ling+zhan[shucnt].ling*zhan[shucnt+1].yi+zhan[shucnt].ling*zhan[shucnt+1].ling)%10007;int linyi=(zhan[shucnt].yi*zhan[shucnt+1].yi)%10007;zhan[shucnt].yi=linyi;zhan[shucnt].ling=linling;}++fucnt;fu[fucnt]='+';}if(ch[i]=='*'){++fucnt;fu[fucnt]='*';if(ch[i-1]!=')'){++shucnt;zhan[shucnt].ling=1;zhan[shucnt].yi=1;}}if(ch[i]==')'){if(ch[i-1]!=')'){++shucnt;zhan[shucnt].ling=1;zhan[shucnt].yi=1;}while(fu[fucnt]!='('){int linling;int linyi;if(fu[fucnt]=='+'){ shucnt--; linling=(zhan[shucnt].ling*zhan[shucnt+1].ling)%10007; linyi=(zhan[shucnt].ling*zhan[shucnt+1].yi+zhan[shucnt].yi*zhan[shucnt+1].ling+zhan[shucnt+1].yi*zhan[shucnt].yi)%10007;zhan[shucnt].ling=linling;zhan[shucnt].yi=linyi;}else { shucnt--; linling=(zhan[shucnt].ling*zhan[shucnt+1].yi+zhan[shucnt].yi*zhan[shucnt+1].ling+zhan[shucnt+1].ling*zhan[shucnt].ling)%10007; linyi=(zhan[shucnt].yi*zhan[shucnt+1].yi)%10007;zhan[shucnt].ling=linling;zhan[shucnt].yi=linyi; }fucnt--;}fucnt--;}if(ch[i]=='(')++fucnt,fu[fucnt]='(';}printf("%d",zhan[shucnt].ling%10007);}


0 0