HDU 1237 简单计算器

简单计算器

题目

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。

Input

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

Output

对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

Sample

Input

1 + 2
4 + 2 * 5 - 7 / 11
0

Output

3.00
13.36

解题思路

  1. 不用栈的做法思路:

    声明一个数组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]置为零。

  2. 用栈的做法思路:

    我的用堆栈做法的思路跟不用栈的差不多,也就是把数组换成栈而已,也需要根据读取到的操作符op来判断要怎么样入栈,最后再把栈里的数都加起来。主要是有以下四种形式:

    (1) 如果为+,则下一个数据直接入栈。

    (2) 如果为-,则把下一个数据的相反数入栈

    (3) 如果为*,则先用一个中间变量来存储所要存的下一个数据和上一个数据,也就是现在的栈顶num.top(),进行相乘,然后再让栈顶出栈,最后让这个中间变量入栈。

    (4) 如果为/,则则先用一个中间变量来存储所要存的下一个数据和上一个数据,也就是现在的栈顶num.top(),进行除法运算,然后再让栈顶出栈,最后让这个中间变量入栈。

  3. 要注意的点:由于有空格的输入,所以我选择使用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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值