做这个陆陆续续也弄了好几天,一开始是使用栈在做,因为这种类型的题教材上提过(我相信一定也有不少同学一提到写一个简单的不带括号的计算器也会第一时间想到 栈吧)。不过在做的过程,弄了好久也未能用栈来实现。说实话用栈来做是有点复杂了。不说别的,光是你去定义节点和各个函数就有得你弄几分钟了。也许就这会儿功夫人家不用栈的同学已经把这个题给做出来了。但,这可能也只是我们在逃避对栈的使用吧,等有空还得用栈再实现一下,毕竟对自己还是有一定好处的。在经过百度之后,发现了一种特别简单又容易理解的方法(不得不说这些人真牛逼),经过对代码的阅读和揣摩,理清了原作者的思路之后,于是就自己又来实现了一遍。 牛的代码就那么几行,但功能绝不低于同类型的其它代码!


2015年4月8日16:12:08


至于题目,大家请前往这儿(http://acm.hdu.edu.cn/showproblem.php?pid=1237)


下面就是代码,若哪儿有不对或是什么建议,请各位观者不吝指出!


#include <iostream>
#include <iomanip>//保留小数时所用到的函数被包含在此头文件中
using namespace std;
int main()
{
    double d[100];//储存每一个浮点数
    double sum;// 累计整个数组的和
    double num;// 每次输入的单个浮点数
    char operate;// 操作符

    while(cin >> num)// 开始输入第一个数
    {
        sum = 0;// 每次运算时sum 初始化为0
        int i = 0;
        d[0] = num;// 把第一个数保存的d[0]中
        operate = getchar();// 最来判断最后一次,以输入0和回车来结束程序的运行

        if(operate == '\n' && num == 0) break;// 如果输入0回车,则程序结束

        while(cin >> operate >> num)// 输入第一个数之后,后面每次都是接连一个操作符和一个操作数
        {
            if(operate == '*')// 如果本次输入的是 *号,则将当前元素的数乘以num 并保存到当前元素中
                d[i] *= num;
            else if(operate == '/')// ..
                d[i] /= num;
            else if(operate == '+')// 如果本次输入的是 +号,则将num 放入下一个元素中
                d[++i] = num;
            else
                d[++i] = -num;// v如果是 -号,则把-num 放入下一个元素中

            if(getchar() == '\n')// 判断最后是否以回车键结束
                break;// 是回车,完成本轮计算
        }

        for(i; i >= 0; i--)
            sum += d[i];//输入整个数组中的累计和

        cout <<setprecision(2) <<std::fixed <<sum <<endl;//保留两位小数输出sum
    }

    system("pause");
    return 0;
}


输入格式是每个数和操作符之间有空格隔开.
</pre><pre name="code" class="cpp">
运行结果:</span></p><p></p><p><pre name="code" class="cpp">5 + 6
11.00
3 + 9 / 3 + 6 * 2
18.00
0
请按任意键继续. . .