四则运算是先乘除后加减,如果输入一条带有加减乘除的式子,可以用两个栈分别储存数字和运算符,然后用个for循环先对该式子进行遍历,将数字和运算符分开存储,并比对运算符的优先级进行计算,然后再将运算结果放到数字栈中进行下一步运算,最后输出结果。
1、逻辑思维导图
2、代码
#include<iostream>
#include<stack>
#include<string>
#include<cctype>
using namespace std;
int getPriority(char op)
{
if(op == '+' || op == '-')
return 1;
if (op == '*' || op == '/')
return 2;
return 0;
}
double calculate(double n1, double n2, char o)
{
switch (o)
{
case'+':return n1 + n2;
break;
case'-':return n1 - n2;
break;
case'*':return n1 * n2;
break;
case'/':return n1 / n2;
break;
}
return 0;
}
double evaluateExpression(const string& expression)
{
stack<double>numbers;
stack<char>operation;
for (int i = 0; i < expression.length(); i++)
{
if (expression[i] == ' ')
{
continue;
}
else if (isdigit(expression[i]))
{
double val = 0;
while (i < expression.length() && isdigit(expression[i]))
{
val = val * 10 + expression[i] - '0';
i++;
}
numbers.push(val);
i--;
}
else
{
while (!operation.empty() && getPriority(operation.top()) >= getPriority(expression[i]))
{
double val2 = numbers.top();
numbers.pop();
double val1 = numbers.top();
numbers.pop();
char op = operation.top();
operation.pop();
numbers.push(calculate(val1, val2, op));
}
operation.push(expression[i]);
}
}
while (!operation.empty())
{
double val2 = numbers.top();
numbers.pop();
double val1 = numbers.top();
numbers.pop();
char op = operation.top();
operation.pop();
numbers.push(calculate(val1, val2, op));
}
return numbers.top();
}
int main()
{
string expression = "12*2+12/6-1";
double result = evaluateExpression(expression);
cout<< "result=" <<result<< endl;
return 0;
}