简单计算器
题目
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample
Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Output
3.00
13.36
解题思路
-
不用栈的做法思路:
声明一个数组
num
,然后再根据读取到的操作符op
来判断以怎样的形式存入到数组中,最后再把这个数组里面的数全部加起来。主要是有以下四种形式:(1) 如果为
+
,则下一个数据直接存到num[i]
中。(2) 如果为
-
,则把下一个数据的相反数存到num[i]
中(3) 如果为
*
,则先把数据存入到num[i]
中后,再进行上一个数据num[i-1]
和存好的数据相乘并存入到num[i]
中,即num[i] = num[i - 1] * num [i]
,最后需要把num[i - 1]
置为零。(4) 如果为
/
,则先把数据存入到num[i]
中后,再进行上一个数据num[i-1]
和存好的数据相除并存入到num[i]
中,即num[i] = num[i - 1] / num [i]
,最后需要把num[i - 1]
置为零。 -
用栈的做法思路:
我的用堆栈做法的思路跟不用栈的差不多,也就是把数组换成栈而已,也需要根据读取到的操作符
op
来判断要怎么样入栈,最后再把栈里的数都加起来。主要是有以下四种形式:(1) 如果为
+
,则下一个数据直接入栈。(2) 如果为
-
,则把下一个数据的相反数入栈(3) 如果为
*
,则先用一个中间变量来存储所要存的下一个数据和上一个数据,也就是现在的栈顶num.top()
,进行相乘,然后再让栈顶出栈,最后让这个中间变量入栈。(4) 如果为
/
,则则先用一个中间变量来存储所要存的下一个数据和上一个数据,也就是现在的栈顶num.top()
,进行除法运算,然后再让栈顶出栈,最后让这个中间变量入栈。 -
要注意的点:由于有空格的输入,所以我选择使用getchar来读取操作符。
AC
不用栈
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
double num[200],a;
char op;
while(scanf("%lf",&a)!=EOF)
{
if(a == 0) {
op = getchar();
if (op == '\n')
break;
}
num[0] = a ;
int i = 1;
while (1)
{
op = getchar();
if(op == '+'){
cin >> num[i];
i ++;
}
else if(op == '-')
{
cin >> num[i];
num[i] = -num[i];
i ++;
}
else if(op == '*')
{
cin >> num[i];
num[i] = num[i - 1] * num[i];
num[i - 1] = 0;
i ++;
}
else if(op == '/')
{
cin >> num[i];
num[i] = num[i - 1] / num[i];
num[i - 1] = 0;
i ++;
}
else if(op =='\n')
break;
}
double sum = 0;
for (int j = 0; j < i; ++j) { //求和
sum += num[j];
}
printf("%.2lf\n",sum);
}
return 0;
}
用栈
#include <iostream>
#include <cstdio>
#include<stack>
using namespace std;
int main()
{
double a;
char op;
while(scanf("%lf",&a)!=EOF)
{
if(a == 0 )
{
op = getchar();
if(op == '\n')
break;
}
stack<double> num;
num.push(a);
while (1)
{
op = getchar();
if(op == '+'){
cin >> a;
num.push(a);
}
else if(op == '-')
{
cin >> a;
num.push(-a);
}
else if(op == '*')
{
cin >> a;
double ans = num.top() * a;
num.pop();
num.push(ans);
}
else if(op == '/')
{
cin >> a;
double ans = num.top() / a;
num.pop();
num.push(ans);
}
else if(op =='\n')
break;
}
double sum = 0;
while (!num.empty()) //求和
{
sum += num.top();
cout << num.top()<< " ";
num.pop();
}
printf("%.2lf\n",sum);
}
return 0;
}