NOIP2013普及组初赛 第二题 表达是求值
这道题考察对表达式的处理能力,只有+和*两种符号,比较简单
但格式是通用的
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
string s;
int num[100001],ni=0,si=1,i=0,w=10000;
char sym[100001];
void push()
{
sym[++si]=s[i];
}
void pop()
{
switch(sym[si--])
{
case'+':num[--ni]+=num[ni+1];num[ni]%=w;break;
case'*':num[--ni]*=num[ni+1];num[ni]%=w;break;
}
}
bool can() //判断优先级
{
if(s[i]=='+'&&sym[si]!='(') return 1;
if(s[i]=='*'&&sym[si]=='*') return 1;
return 0;
}
main()
{
cin>>s;
s[s.size()]=')';
sym[si]='(';
while(i<s.size())
{
while(s[i]=='(') //左括号处理
{
push();i++;
}
int x=0; //取数处理
while(s[i]>='0'&&s[i]<='9')
{
x=x*10+s[i++]-'0';
if(x>=w)x%=w;
}
num[++ni]=x;
do
{
if(s[i]==')') //右括号处理
{
while(sym[si]!='(')
pop();
}
else
{ //根具标志函数优先级来作运算符入栈或栈运算处理
while(can()) pop();
push();
}
i++;
}while(i<s.size()&&s[i-1]==')');
}
printf("%d",num[1]%w);
return 0;
}