先上代码
double expression(string &str)
{
stack<char> ops;
stack<double> vals;
for(int i = 0; i < str.size(); ++i)
{
char ch = str.at(i);
if(ch == '(')
;
else if(ch == '+')
ops.push(ch);
else if(ch == '-')
ops.push(ch);
else if(ch == '*')
ops.push(ch);
else if(ch == '/')
ops.push(ch);
else if(ch == ')')
{
char op = ops.top();
ops.pop();
double v = vals.top();
vals.pop();
if(op == '+')
{
v = vals.top() + v;
vals.pop();
}
else if(op == '-')
{
v = vals.top() - v;
vals.pop();
}
else if(op == '*')
{
v = vals.top() * v;
vals.pop();
}
else if(op == '/')
{
v = vals.top() / v;
vals.pop();
}
vals.push(v);
cout << v << endl;
}
else
vals.push(atof(&ch));
}
return vals.top();
}
函数传参一个表达式的字符串,该表达式由括号、运算符和操作数组成。该表达式是一个运算符对应一对括号,括号不能省略,如(1+(2*3)),不能是1+(2*3),如(1+(((2+3)*(4*5))+5)),不能是(1+(((2+3)*(4*5)+5)),所以说格式是固定的,必须遵循这个规则的表达式算出来的结果才是对的;
我们根据以下4种情况从左到右逐个将这些实体送入栈处理:
1.将操作数压入操作数栈;
2.将运算符压入运算符栈;
3.忽略左括号;
4.在遇到右括号时,弹出一个运算符,弹出所需数量的操作数,并将运算符和操作数的运算结果压人操作数栈;
在处理完最好一个右括号后,操作数栈上只会有一个值,它就是表达式的值
下面加代码运行看看
int main(int argc, char *argv[])
{
string str = "(1+(((2+3)*(4*5))+5))";
cout << expression(str);
}
输出结果: