表达式求值

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;
}

原文地址:https://www.cnblogs.com/lwhinlearning/p/5661698.html