NYOJ-0035-表达式求值

来源:互联网 发布:管家婆软件打印不了 编辑:程序博客网 时间:2024/06/08 04:27

表达式求值

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

 NYOJ上的题,运用栈相关的知识,开始时套用学长的框架,但细节部分仍是自己的,出错的情况会在下面说到

 请看思路:

  1.用字符串输入,建立两个栈,一个储存数字,另一个储存运算符;

  2.运算符要先建立优先级,符合四则运算的规律,防止出现1+2*3=9的情况;

  3.括号里的要先计算(我是把括号的优先级当做最低,在循环时遇到左括号直接进栈,遇右括号一直计算到运算符栈顶是左括号为 止,这样就达到了先计算括号内式子的目的,还有,注意右括号判断摆放的位置,一定是左括号在前,紧接着是右括号,后面是其他(我犯过这样的错误,(1+2)*3计算终止,调试发现运算符栈顶是右括号无法计算,亲身体验));

  4.当前 str[i] 是运算符且优先级比运算符栈顶的运算符大,直接进栈(先乘除,后加减,例子同2);

  5.当前 str[i] 是运算符且优先级比运算符栈顶的运算符小或相等,要先计算栈顶运算符,不然会出现1-2-3=2的情况;

  6.由于字符串表达式以 ' = ' 结尾,因此判断等号应在最前方,一旦遇到 ' = ' ,直接跳出循环,可以节省接下来几步判断的时间

下面是代码部分:

 
#include  #include #include #include #include using namespace std;//建立优先级关系int priority( char ch ){switch( ch ){case '+': case '-' : return 1;case '*': case '/' : return 2;case '=': return 0;}}//四则运算操作void algor( stack& num , stack& sign ){double a , b;char ch;a = num.top();  num.pop();b = num.top();  num.pop();ch = sign.top();switch( ch ){case '+' : num.push( b+a ); break;case '-' : num.push( b-a ); break;case '*' : num.push( b*a ); break;case '/' : num.push( b/a ); break;}sign.pop();}int main(){stack sign ;stack num ;int n,i,len;double x;char str[1005],temp[200];scanf( "%d" , &n );while( n-- ){scanf( "%s" , str );len = strlen(str);for( i=0 ; i头文件中int j=0;while( isdigit( str[i] ) && i头文件中num.push(x);}else {    //判断顺序('=' -> '(' -> ')' -> 其他运算符)if( str[i]=='=') break;if( str[i] == '(' )sign.push( str[i] );else if( str[i] == ')' ){while( sign.top() != '(' )algor( num , sign );sign.pop();}else if( sign.empty() || sign.top() == '(' )sign.push( str[i] );else if( priority( str[i] ) > priority(sign.top()) ){sign.push( str[i] );}else{ while( !sign.empty() && priority( str[i] ) <= priority(sign.top()) ){algor( num , sign );}sign.push( str[i] );}}}while( !sign.empty() )algor( num , sign );printf( "%.2lf\n" , num.top() );num.pop(); }}
原创粉丝点击