一、表达式形式
形如(3*(2+5)),每个运算符之间都有括号相隔
二、问题
假设一中的表达式是一段程序可读的字符串,如何计算表达式的值
三、思路
1.创建两个栈,分别为数字栈、和运算符栈
2.遍历字符串
2.1遍历遇到‘(’不处理
2.2遍历到数字,将数字储存到数字栈中
2.3遍历到运算符,将运算符储存到运算符栈中
2.4遍历到‘)’,从数字栈中取出两个数,从运算符中取出栈顶的运算符,
2.5计算两个数和运算符计算后的结果,将计算结果储存到数字栈中
3.当遍历结束时,数字栈中的栈顶元素即为表达式结果
过程示例:
代码:
int cal(int a, int b, const char op)
{
switch (op)
{
case('+'):
return a + b;
case('-'):
return a - b;
case('*'):
return a * b;
case('/'):
return a / b;
default:
break;
}
}
void calculator(const string &s)
{
stack<char> opt;
stack<int> num;
char ch;
for (int i = 0; i < s.length();)
{
ch = s[i];
if (ch >= '0'&& ch <= '9')
{
int number = 0;
while (ch >= '0'&&ch <= '9')
{
number = number * 10 + ch - '0';
ch = s[++i];
}
num.push(number);
}
else if (ch == '(') { i++; }
else if (ch == ')')
{
i++;
int num2 = num.top(); //注意弹出数的顺序
num.pop();
int num1 = num.top();
num.pop();
char op = opt.top();
opt.pop();
int temnum = cal(num1, num2, op);
num.push(temnum);
}
else
{
i++;
opt.push(ch);
}
}
cout << "计算结果:";
cout << num.top();
}