括号题的话用字符窜流比较好写,因为不用每次重新定位。
1 实现计算器,包括+/- 负号,括号的计算 例如"(1+(4+5+2)-3)+(6+8)" = 23
// recursive way
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int calculate(stringstream& ss) {
int res = 0, sign = 1;
while(ss) {
if(isdigit(ss.peek())) {
int val;
ss >> val;
res += sign * val;
continue;
}
char ch;
ss >> ch;
if(ch == ')') {
return res;
}
if(ch == '(') {
res += sign * calculate(ss);
}
if(ch == '-') {
sign = -1;
}
if(ch == '+') {
sign = 1;
}
}
return res;
}
int calculate(string&& s) {
stringstream ss;
ss << std::noskipws << s;
return calculate(ss);
}
int main()
{
cout << calculate("0") << endl;
}
1 实现计算器,包括+ - * / 负号,括号的计算 例如"(1+(4+5+2)-3)+(6+8)" = 23
// Example program
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int calculate(stringstream& ss) {
int res = 0, left = 0;
char ch = '+';
while(ss) {
int right = 0;
ss >> std::ws;
if(isdigit(ss.peek()) || ss.peek() == '(') {
if(ss.peek() == '(') {
ss.get();//ignore '('
right = calculate(ss);
}else {
ss >> right;
}
if(ch == '+' || ch == '-') {
res += left;
left = (ch == '+')? right : -right;
}else {
left = ((ch == '*') ? left * right : left / right);
}
continue;
}
ss >> ch;
if(ch == ')') {
return res + left;
}
}
return res + left;
}
int calculate(string&& s) {
stringstream ss;
ss << s;
return calculate(ss);
}
int main()
{
cout << calculate("1+(9+8)*(7+8*3+(9+8)*6)+(8-7)*5+6") << endl;
}