寒假Day40:HDU237-简易计算器-栈+getchar()
题面:
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。 Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。 Output 对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input 1 + 2 4 + 2 * 5 - 7 / 11 0 Sample Output
3.00 13.36
思路:这一题我一开始其实是gets全部读入,再开数组去空格,之后利用一个for循环取出数字进行处理的,
但是后来搜了一下发现有更简洁的代码,很好的利用了getchar,后来用getchar ac的。
AC代码:
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> #include<stack> using namespace std; int main() { double x; while(~scanf("%lf",&x)) { stack<double>s; char ch=getchar(); if(x==0&&ch=='\n') break; s.push(x); ch=getchar();// while(~scanf("%lf",&x)) { if(ch=='+') s.push(x); else if(ch=='-') s.push(x*(-1)); else if(ch=='*') { double y=s.top(); s.pop(); y*=x; s.push(y); } else if(ch=='/') { double y=s.top(); s.pop(); y=y/x; s.push(y); } if(ch=getchar()=='\n')//不能else if//不能放在开始就判断 break; ch=getchar(); // if(ch=='\n') // break; } double ans=0; while(!s.empty()) { ans+=s.top(); s.pop(); } printf("%.2lf\n",ans); } return 0; }
写代码的时候,如果有更简单并且思路更清晰的代码可以去解决,那么就应该去选择改变方法;
解决一个问题的时候,应该是用最简单最简短的代码去实现核心思想,而不是掺杂其他东西在里面
待解决:
最后的for循环里面的getchar不知道为什么不能单独拿出来break,答案是错误的