2017.5.6 表达式的值 思考记录

xiaoxiao2021-02-28  121

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

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

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

        (+   :  +号前一定有数    

         )+ :  +号前一定没有数

         + +:  +号前一定有数

          * +:  +号前一定有数

         

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

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

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

码:

#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)007; int linyi=(zhan[shucnt].yi*zhan[shucnt+1].yi)007; 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)007; linyi=(zhan[shucnt].ling*zhan[shucnt+1].yi+zhan[shucnt].yi*zhan[shucnt+1].ling+zhan[shucnt+1].yi*zhan[shucnt].yi)007; 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)007; linyi=(zhan[shucnt].yi*zhan[shucnt+1].yi)007; zhan[shucnt].ling=linling; zhan[shucnt].yi=linyi; } fucnt--; } fucnt--; } if(ch[i]=='(')++fucnt,fu[fucnt]='('; } printf("%d",zhan[shucnt].ling007); }

转载请注明原文地址: https://www.6miu.com/read-64178.html

最新回复(0)