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);
}
首先判断哪个位置有数,肯定先找运算符、、
这是其实只用看这一个符号和上一个符号,害怕遗漏的话可以罗列一下:
(+ : +号前一定有数
)+ : +号前一定没有数
+ +: +号前一定有数
* +: +号前一定有数
所以只要+号前不是)就有数
而且要考虑运算符后面的,就需要对右括号进行同“+”的处理,不同的是这个右括号要一直推到左括号
用运算符优先级的方法建立两个栈处理运算::能放就放,如果+号前是*号就一直把*法做完、
码:
#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);
}
相关文章推荐
- 2017.5.6 联合权值 思考记录
- 2017.5.6 子矩阵 思考记录
- 2017.7.30 玩具装箱 思考记录
- 2017.4.21 螺旋矩阵 思考记录
- 2017.4.22 进制转换 思考记录
- 2017.8.5 One-Dimensional 思考记录
- 正则表达式学习记录
- 2017.8.9 老C的键盘 思考记录
- mysql 运行时配置小思考记录
- python核心编程学习记录之正则表达式
- 2017.5.7 能量项链 思考记录
- 对正则表达式不熟悉,记录几个从别处拿来验证过的表达式,日期、数字、email、网址验证
- 2017.5.8 文化之旅 思考记录
- 2017.5.11 道路修建 思考记录
- [生而为人-思考] Knowledge Cooking -4th 分享会记录
- 2017.8.17 陌上花开 思考记录
- 2017.10.13 硬币游戏 思考记录
- 2017.3.31 洞穴勘测 思考记录
- python 学习记录(2)—re 正则表达式模块的使用