NYOJ35_表达式求值

表达式求值

时间限制: 3000  ms  |  内存限制: 65535  KB
难度: 4
 
描述
ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)
 
输入
第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
输出
每组都输出该组运算式的运算结果,输出结果保留两位小数。
样例输入
2
1.000+2/4=
((1+2)*5+1)/4=
样例输出
1.50
4.00
来源
数据结构课本例题改进
上传者
张云聪

 


#include<stdio.h>
#include<cstdio>
#include<stack>
#include<stdlib.h>
using namespace std;
int in(char ch)
{
 if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='=')
  return 1;
 return 0;
}
char pre(char a,char b)//a栈顶优先级判断
{
 int i,j;
 char fuhao[8]={'+','-','*','/','(',')','='};
 char c[7][7]={{'>','>','<','<','<','>','>'},{'>','>','<','<','<','>','>'},
 {'>','>','>','>','<','>','>'},{'>','>','>','>','<','>','>'},
 {'<','<','<','<','<','=',' '},{'>','>','>','>',' ','>','>'},{'<','<','<','<','<',' ','='}};
// for(i=0;i<7;i++)
// {
//  for(j=0;j<7;j++)
//  printf("%c ",c[i][j]);
//  printf("\n");
// }

 for(i=0;i<7;i++)
  if(a==fuhao[i])
   break;
 for(j=0;j<7;j++)
  if(b==fuhao[j])
   break;
//   printf("i==%d,j==%d",i,j);
  return c[i][j];
}
double calculate(double a,char c,double b)
{
 switch(c)
 {
 case '+':
  return a+b;
 case '-':
  return a-b;
 case '*':
  return a*b;
 case '/':
  return a/b;
 }
}
int main()
{
 int n,j;
 char ch,c,str[18];
 double a,b,intg;
 stack<double>opnd;
 stack<char>oper;
 scanf("%d",&n);
 getchar();
 while(n--)
 {
  ch=getchar();
  oper.push('=');
  while(ch!='='||oper.top()!='=')
  {
   if(!in(ch))//不是运算符进栈
   {
  //  printf("%c\n",ch);
    j=0;
    while(!in(ch))
    {
     str[j++]=ch;
     ch=getchar();
    }
    str[j]='\0';
    intg=atof(str);
    opnd.push(intg);
   }
   else
    switch(pre(oper.top(),ch))
   {
   
    case '<'://栈顶元素优先级低
     oper.push(ch); 
     ch=getchar();
     break;
    case '>'://退栈并将运算结果进栈
     c=oper.top();
     oper.pop();
     b=opnd.top();
     opnd.pop();
     a=opnd.top();
     opnd.pop();
    // printf("%lf%lf%c\n",a,b,c);
     opnd.push(calculate(a,c,b));
     break;
    case '='://脱括号并接收下一字符串
     oper.pop();
     ch=getchar();
     break;
   }

  }
  printf("%.2lf\n",opnd.top());
 }
 return 0;
}
 

你可能感兴趣的:(表达式求值)