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(); }}
阅读全文
0 0
- NYOJ-0035-表达式求值
- NYOJ 35 表达式求值
- NYOJ 35表达式求值
- NYOJ 409表达式求值
- NYOJ-35-表达式求值
- nyoj 35 表达式求值
- NYOJ 35 表达式求值
- 表达式求值 nyoj
- NYOJ 35 表达式求值
- NYOJ 35-表达式求值
- nyoj 305 表达式求值
- NYOJ,305,表达式求值
- nyoj-305-表达式求值
- nyoj 35 表达式求值
- 表达式求值(nyoj 305)
- NYOJ 35表达式求值
- NYOJ-35 表达式求值
- NYOJ--表达式求值
- 世事无常,珍惜当下
- LRU在MySQL缓存池的实现
- 使用Cache-Control: no-store头,禁止IE浏览器保存临时文件,保护机密信息
- NYOJ 305 表达式求值
- 数据结构简述
- NYOJ-0035-表达式求值
- Linux下的find指令
- java普通类中,获取request
- 思源慢涌
- API生命周期第二阶段——设计:如何设计API(基于swagger进行说明)
- 腾讯云服务器学生一元套餐领取页面
- “谈谈浏览器兼容性”
- codeforces702C Cellular Network(二分)
- C++ 小知识