码迷,mamicode.com
首页 > 其他好文 > 详细

nyoj35表达式求值

时间:2015-08-05 22:28:07      阅读:262      评论:0      收藏:0      [点我收藏+]

标签:

/*注意各个符号的优先级,建议看懂符号的优先级后在看代码。有助于你理解:以下为代码*/
#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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

nyoj35表达式求值

标签:

原文地址:http://blog.csdn.net/bailuweishuang520/article/details/47302789

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!