1 + 2 4 + 2 * 5 - 7 / 11 0
3.00 13.36
做了这道题我发现那些能编写计算器的人简直屌爆了。。
卡了我一天的题目,还只是简单的简算,还没用到任何函数,对数,根号运算。
上代码吧。我的思想就是用栈做。先将第一个数推进栈,然后不断的进栈,出栈,运算。
#include <stdio.h> #include <stack> #include <algorithm> using namespace std; int main() { double n,m; char c; while(~scanf("%lf",&n)) //首先输入一个数 { c=getchar(); // 从键盘上得到一个字符,可以使空格也可以使回车。 if(c=='\n' &&n==0) //如果N为0并且直接回车的话按题目说的结束程序。 break; stack<double>s; // 将double 类型的建立栈 s.push(n); // 将第一个数推进栈 scanf("%c",&c); // 开始输入一个字符 while(~scanf("%lf",&n)) //继续输入一个数 { if(c=='*') // 如果字符为乘号 { m=s.top();// 令m等于栈首元素(可理解为第一个数) m*=n;// m* n为它们的结果 s.pop();// 此时清空栈 s.push(m); // 将m推进栈。 } if(c=='/') { m=s.top(); m/=n; s.pop(); s.push(m);// 以上同上 } if(c=='+') s.push(n);// 直接推进栈 if(c=='-') s.push(0-n);// 直接推进栈 if(getchar()=='\n') break;// 一旦遇到回车直接跳出 c=getchar();// 反复输入符号 } double sum=0; while(!s.empty()) //如果有加号,或者减号,说明栈是不空的,因为有元素被推进去了 { sum+=s.top();// 不断的加上栈首元素。 s.pop(); //不断的弹栈,直到栈空为止。 } printf("%.2lf\n",sum);//sum的值即为整个表达式最终的值了。 } return 0; }
原文地址:http://blog.csdn.net/sky_miange/article/details/43157455