NYOJ 1272 表达式求值 (字符串处理)

来源:互联网 发布:全职之烽火知韩 编辑:程序博客网 时间:2024/05/03 10:56

表达式求值

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述
假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式。 2. 如果 X 和 Y 是 表达式,则 X+Y, X*Y 也是表达式; *优先级高于+. 3. 如果 X 和 Y 是 表达式,则 函数 Smax(X,Y)也是表达式,其值为:先分别求出 X ,Y 值的各位数字之和,再从中选最大数。 4.如果 X 是 表达式,则 (X)也是表达式。 例如: 表达式 12*(2+3)+Smax(333,220+280) 的值为 69。 请你编程,对给定的表达式,输出其值。  
输入
【标准输入】 第一行: T 表示要计算的表达式个数 (1≤ T ≤ 10) 接下来有 T 行, 每行是一个字符串,表示待求的表达式,长度<=1000
输出
【标准输出】 对于每个表达式,输出一行,表示对应表达式的值。
样例输入
312+2*312*(2+3)12*(2+3)+Smax(333,220+280)
样例输出
186069

思路:不管Smax,把‘,’当做一种新的运算代替Smax,推出优先级表就好做了。。

代码:

#include<stdio.h>#include<stack>#include<string.h> using namespace std;char ope[10]="+-*,()#";char prec[10][8]={//   +-*,()#    //运算符优先级             ">><><>>",            ">><><>>",            ">>>><>>",            "<<<><>>",            "<<<<<=>",            ">>>>=>>",            "<<<<<<=",                 };int getNum(char c){for(int i=0;i<strlen(ope);i++){if(ope[i]==c) return i;}}char getPrec(char a,char b)//返回a,b优先级 {int x=getNum(a);int y=getNum(b);return prec[x][y]; }int mod(int n)//取余求和 {int sum=0;while(n>0){sum+=n%10;n=n/10;}return sum;}int caculate(int a,int b,char threat)//计算 {  switch(threat)  {  case '+': return a+b;  case '-': return a-b;  case '*': return a*b;  case ',': return mod(a)>mod(b)?mod(a):mod(b);   }  } int main(){      int t;scanf("%d",&t);char str[1050];stack<int>num;stack<char> op;while(t--){    scanf("%s",str);op.push('#');    int len=strlen(str);    str[len]='#';    str[len+1]='\0';    len++;    bool input=false;//标记接受数字     int temp=0;for(int i=0;i<len;i++){   if(str[i]>='0'&&str[i]<='9')//处理数字    {         input=true; temp=temp*10+str[i]-'0';   }   else if(str[i]=='+'||str[i]=='-'||str[i]==','||str[i]=='*'||str[i]=='('||str[i]==')'||str[i]=='#')   {      if(input)//没有接收数字就不push   {  num.push(temp);        temp=0;        input=false;  }  int flag=true;//当栈顶元素优先级大于str[i]时,一直运算   while(flag)  {  switch(getPrec(op.top(),str[i]))  {  case '<': op.push(str[i]);flag=false;break;//栈顶元素优先级低,运算符入栈   case '=': op.pop();flag=false;break;//去括号   case '>': {          int a=num.top();num.pop();          int b=num.top();num.pop();          char threat=op.top();op.pop();      //     printf("%d %c %d\n",a,threat,b);          num.push(caculate(a,b,threat)); break;  }  }  }     }}        printf("%d\n",num.top());//输出栈顶元素     num.pop();}}  


0 0
原创粉丝点击