简单计算器
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 13316 Accepted Submission(s): 4385
Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2 4 + 2 * 5 - 7 / 11 0
Sample Output
3.00 13.36
Source
做了这道题我发现那些能编写计算器的人简直屌爆了。。
卡了我一天的题目,还只是简单的简算,还没用到任何函数,对数,根号运算。
上代码吧。我的思想就是用栈做。先将第一个数推进栈,然后不断的进栈,出栈,运算。
#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;
}