您的位置:首页 > 其它

2017.5.6 表达式的值 思考记录

2017-05-06 21:16 267 查看
        这个题严重不符普及组的身份、、虽然是模拟,但如果想不清楚是很难入手的

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

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

        (+   :  +号前一定有数    

         )+ :  +号前一定没有数

         + +:  +号前一定有数

          * +:  +号前一定有数

         

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

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

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

码:

#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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: