这个题严重不符普及组的身份、、虽然是模拟,但如果想不清楚是很难入手的
首先判断哪个位置有数,肯定先找运算符、、
这是其实只用看这一个符号和上一个符号,害怕遗漏的话可以罗列一下:
(+ : +号前一定有数
)+ : +号前一定没有数
+ +: +号前一定有数
* +: +号前一定有数
所以只要+号前不是)就有数
而且要考虑运算符后面的,就需要对右括号进行同“+”的处理,不同的是这个右括号要一直推到左括号
用运算符优先级的方法建立两个栈处理运算::能放就放,如果+号前是*号就一直把*法做完、
码:
#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); }