nyist 35 表达式求值(后缀表达式)
来源:互联网 发布:java两个字符串compare 编辑:程序博客网 时间:2024/05/21 10:15
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)
- 输入
- 第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0 - 输出
- 每组都输出该组运算式的运算结果,输出结果保留两位小数。
- 样例输入
21.000+2/4=((1+2)*5+1)/4=
- 样例输出
1.504.00
对于这类题目通常转化为后缀表达式来计算。
两个栈:一个存值,一个存操作符:
对于操作符:
如果为‘(’:进栈
如果为‘)’:依次计算括号内表达式的值。
如果为其他:如果栈顶的优先级大于等于此字符,不断出栈运算。
#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<string>#include<iostream>#include<queue>#include<cmath>#include<map>#include<stack>#include<bitset>using namespace std;#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )#define CLEAR( a , x ) memset ( a , x , sizeof a )typedef long long LL;typedef pair<int,int>pil;const int INF = 0x3f3f3f3f;const int maxn=1100;char str[maxn];stack<char>s;stack<double>ans;int t;int ok(char x){ if(x=='+'||x=='-') return 1; else if(x=='*'||x=='/') return 2; else if(x=='(') return 0; else return -1;}double cal(double s1,double s2,char c){ if(c=='+') return s2+s1; else if(c=='-') return s2-s1; else if(c=='*') return s2*s1; else return s2/s1;}void solve(){ double x1=ans.top();ans.pop(); double x2=ans.top();ans.pop(); double x=cal(x1,x2,s.top()); s.pop();ans.push(x);}int main(){ scanf("%d",&t); s.push('#'); while(t--) { scanf("%s",str); int cnt=0; while(!ans.empty()) ans.pop(); int len=strlen(str); for(int i=0;i<len-1;i++) { if(str[i]>='0'&&str[i]<='9') { char temp[110];CLEAR(temp,0);int l=0; while(str[i]>='0'&&str[i]<='9'||str[i]=='.') temp[l++]=str[i++]; double x=atof(temp); ans.push(x); i--; } else if(str[i]=='(') s.push(str[i]); else if(str[i]==')') { while(s.top()!='(') solve(); s.pop(); } else { while(ok(s.top())>=ok(str[i])) solve(); s.push(str[i]); } } while(s.top()!='#') solve(); printf("%.2f\n",ans.top()); } return 0;}
0 0
- nyist 35 表达式求值(后缀表达式)
- nyist 35 表达式求值
- nyist 305 表达式求值
- nyist 1272 表达式求值 (河南省第九届省赛) 中缀转后缀
- NYOJ 35 表达式求值 【中缀转后缀+后缀表达式求值】
- 表达式求值(中缀转后缀及后缀表达式求值)
- nyist 305 表达式求值 (递归)
- 表达式求值(后缀表达式)--栈
- 【表达式求值】中缀表达式变后缀+后缀表达式的求法 (NYOJ 35+NYOJ 1272表达式求值)
- 后缀表达式的求值
- 后缀表达式求值
- 后缀表达式求值
- 后缀表达式求值
- 后缀表达式求值
- 后缀表达式求值
- 【转载】后缀表达式求值
- 后缀表达式求值
- 后缀表达式求值
- 用循环计算1--100的总和
- C++ IO流:输入、输出格式控制
- 图解Oracle存储过程教程
- OpenSSL RSA AES Base64的一点注意事项
- xcode_shell
- nyist 35 表达式求值(后缀表达式)
- 写在25岁的某晚
- iOS中的富文本技术(1)-TextKit简介
- Java 中类和方法修饰符
- 获取mac上所有文件
- 【Socket编程】使用C++实现Server端和Client端
- Bugzilla:安装Perl 模块失败的解决办法
- hdu 4986 Arc of Dream 矩阵快速幂求递推式
- 决策树算法ID3,C4.5, CART