一、表达式形式
2*3+6/3+5
二、问题
假设一中的表达式是一段程序可读的字符串,如何计算表达式的值
三、思路
1.创建两个栈,分别为数字栈、和运算符栈
2.遍历字符串
3.当遇到数字将数字存储到数字栈中
4.当遇到运算符时,比较运算符栈顶元素和当前运算符的优先级
4.1若当前元素大于栈顶元素,将当前元素压入运算符栈
4.2若当前元素小于等于栈顶元素,将栈顶元素弹出
4.2.1将数字栈中的前两个元素弹出与运算符栈弹出的元素计算结果
4.2.2将计算结果保存到数字栈中
5.遍历结束后,重复4步骤直到运算符栈没有运算符
6.最后表达式的结果为栈顶元素
代码:
//比较运算符优先级
int cmp(const char a, const char b)
{
if (pri[a] >= pri[b]) return 1;
else if (pri[a] < pri[b]) return 0;
}
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;
}
/**
*应为表达式没有括号
*所以要考虑运算符的优先级
*将优先级储存在map中,并在cmp函数中比较
*当将要入栈的运算符的优先级小于或等于则计算
*栈顶元素相邻数字的结果
*/
void calculator2(const string &s)
{
//利用map储存运算符的优先级
pri['$'] = -1;
pri['+'] = 1;
pri['-'] = 1;
pri['*'] = 2;
pri['/'] = 2;
stack<char> op;
stack<int> num;
op.push('$');
char ch;
for (int i = 0; i < s.length();)
{
ch = s[i];
if (ch <= '9' && ch >= '0')
{
int number = 0;
while (ch >= '0'&&ch <= '9')
{
number = number * 10 + ch - '0';
ch = s[++i];
}
num.push(number);
}
else if (cmp(op.top(), ch)==0)
{
op.push(ch);
i++;
}
else {
int num1, num2, op1;
num1 = num.top();
num.pop();
num2 = num.top();
num.pop();
op1 = op.top();
op.pop();
int temp = cal(num2,num1,op1);
num.push(temp);
}
}
while (op.top()!='$')
{
int num1, num2, op1;
num1 = num.top();
num.pop();
num2 = num.top();
num.pop();
op1 = op.top();
op.pop();
int temp = cal(num2, num1, op1);
num.push(temp);
}
cout << "计算结果:";
cout << num.top();
}