[LeetCode]Basic Calculator II

来源:互联网 发布:最优化方法第二版pdf 编辑:程序博客网 时间:2024/05/22 10:22

题目不难,但是想做对却也需要考虑很多细节。
没有括号的运算就是先乘除后加减,思路是把➕和➖看作分隔符,先计算分隔符隔开的一个个term,再把term相加。
举个例子:a+b*c/d-e,在这个例子中,读到第一个➕时,term是a,并且我们可以认为a已经被➕分割开了,可以加到总和里去了,所以sum现在是a,term往后读一个数,是b。然后往后读一个符号是✖️,所以term=term*c,即term = b*c。再向后读一个符号是➗,所以term=b*c/d。再读一个符号是减号,我们可以认为term已经被分割开,可以加入总和了,于是sum = a+b*c/d。但注意因为是➖,所以term是-e而不是e。所以我们只需要在运算式两端补两个➕,就可以完成了。

贴出下面的代码主要是因为它运用了stringstream这个类,非常好用。

iostream 标准库支持内存中的输入/输出,只要将流与存储在程序内存中的 string 对象捆绑起来即可。此时,可使用 iostream 输入和输出操作符读写这个 string 对象。标准库定义了三种类型的字符串流:
• istringstream,由 istream 派生而来,提供读 string 的功能。
• ostringstream,由 ostream 派生而来,提供写 string 的功能。
• stringstream,由 iostream 派生而来,提供读写 string 的功能。
要使用上述类,必须包含 sstream 头文件。
另外getline也可以用来作split的功能,原型是getline(istream&,string&,char delim)

int calculate(string s) {        istringstream in('+'+s+'+');        int term = 0, total = 0, n;        char op;        while (in>>op){            if (op == '+' || op == '-'){                total += term;                in >> term;                term *= op == '+' ? 1 : -1;            }else{                int tmp;                in >> tmp;                if (op == '*') term *= tmp;                else term /= tmp;            }        }        return total;    }
0 0
原创粉丝点击