给定一个包含正整数、加(+)、减(-)、乘()、除(/)的算数表达式(括号除外),计算其结果。表达式仅包含非负整数,+, - ,,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2"
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
思路:
使用五个参数,从表达式前三个数开始计算,每计算完两个数的结果,就向后补齐成三个数的表达式直至表达式计算完成。
详解:
在不需要使用‘()’的简单计算器中,一个四则运算的表达式可以拆分为含有两个操作符,三个数字的简单表达式,num1 opt1 num2 opt2 num2 (类比:1 + 2 - 3):
1.当opt1(+)的优先级大于opt2(-)时。先算 n1 + n2 ,得到结果作为新表达式的 n1 ,而原opt2 变成新表达式的 opt1、原n3变n2。
n1 + n2 - n3;
(n1+n2)-n3;
n1-n2; // 此时的n1是原n1+n2
2.当opt1(+)的优先级小于opt2(*)时。先算 n2 * n3 ,得到结果作为新表达式的 n2。
n1 + n2 * n3;
n1+(n2*n3);
n1-n2; // 此时的n2是原n2*n3
3.每进行一次运算,数字和操作符各自减少一个,我们把表达式中剩余的式子按顺序取一个操作符和数字变成新的opt2,和num3 。此时,有组成了 n1 opt1 n2 opt2 n3的组合。
循环以上过程可以计算完整个表达式。
bool MaxOpter(char a, char b)
{
if (a == '*' || a == '/')
{
return true;
}
else
{
if (b == '+' || b == '-')
return true;
else
return false;
}
}
int execute(int a, char opt, int b)
{
int ret = 0;
if (opt == '+')
{
ret = a + b;
}
else if (opt == '-')
{
ret = a - b;
}
else if (opt == '*')
{
ret = a * b;
}
else if (opt == '/')
{
ret = a / b;
}
else
{
perror("opter is error");
}
return ret;
}
int Calc()
{
int num1, num2, num3;
char opt1, opt2;
scanf("%d", &num1); // 接受第一个数
opt1 = getchar();
scanf("%d", &num2);
opt2 = getchar();
while (opt2 != '\n')
{
scanf("%d", &num3);
if (MaxOpter(opt1, opt2)) // opt1 > opt2
{
num1 = execute(num1, opt1, num2); // 和 成为新表达式的第一项,num1,opt1
opt1 = opt2;
num2 = num3; // 本次计算,num3没有参与,
// 计算num1+num2后成为新的num1,则原来num3成为num2
}
else
{
num2 = execute(num2, opt2, num3);
}
opt2 = getchar();
}
return execute(num1, opt1, num2);
}
int main()
{
while (1)
{
printf("%d \n", Calc());
}
return 0;
}
除此之外,我们还可以使用后缀式进行计算,详情请参考:C++ | 栈的应用(逆波兰算法) | 计算器