您的位置:首页 > 其它

nyoj35表达式求值

2015-08-05 20:23 435 查看
/*注意各个符号的优先级,建议看懂符号的优先级后在看代码。有助于你理解:以下为代码*/

#include<stdio.h>

#include<string.h>

#include<stack>

#include<algorithm>

#include<stdlib.h>

using namespace std;

double zhao1(double a,char op,double b)

{

 switch(op)

 {

  case '+':return a+b;break;

  case '-':return a-b;break;

  case '*':return a*b;break;

  case '/':return a/b;break;

 }

}

char zhao2(char c1,char c2)

{

 if(c1=='+'||c1=='-')

 {

  if(c2=='*'||c2=='/'||c2=='(')

  return '<';

  else

  return '>';

 }

 if(c1=='*'||c1=='/')

 {

  if(c2=='(')

  return '<';

  else

  return '>';

 }

 if(c1=='('||c1=='=')

 {

  if(c1=='('&&c2==')'||c1=='='&&c2=='=')

  return '=';

  else

  return '<';

 }

}

int main()

{

 int T,k,i;

 bool flag;

 double x,y;

 scanf("%d",&T);

 while(T--)

 {

  char a[1000],t[1000],op;

  scanf("%s",a);

  stack<double> num;

  stack<char> ch;

  ch.push('=');

  flag=false,k=0;

      for(i=0;a[i]!='\0';)

   {

   if(a[i]>='0'&&a[i]<='9'||a[i]=='.')

   {

    t[k++]=a[i++];

       flag=true;

        continue;

   }

  if(flag)

  {

   t[k]='\0';

   num.push(atof(t));

   flag=false;

   k=0;

  }

  switch(zhao2(ch.top(),a[i]))

  {

   case '<':ch.push(a[i]),i++;break;

   case '=':ch.pop(),i++;break;

   case '>':

    y=num.top(),num.pop();

    x=num.top(),num.pop();

    op=ch.top(),ch.pop();

    num.push(zhao1(x,op,y));

  }

   }

   printf("%.2lf\n",num.top());

    }

    return 0;

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