题目:有字符串表示的一个四则运算表达式,要求计算出该表达式的正确数值。 说明:
四则运算即加减乘除"+ -* /"该表达式中的数字只能是1位(数值范围0~9).另若有不能整除的情况,按向下取整处理,eg: 8/3得出值为2。例如:若有字符串"8+7*2-9/3",计算出其值为19。
#include <stdio.h> #include <string.h> #include <assert.h> //!< 实现两个元的运算 int cal(int nNum1, char op, int nNum2) { if (op == '+') { return nNum1 + nNum2; } if (op == '-') { return nNum1 - nNum2; } if (op == '*') { return nNum1 * nNum2; } if (op == '/') { //return ((num1 * 1.0) / num2 + 0.5); return nNum1 / nNum2; } } //!< 解析字符串并计算结果 int calculate(int len, char *expstr) { assert(expstr); if (len < 3) { return -1; } //1.0 先把前三位拿出来,8 + 7 char *p = expstr; int nNum1 = p[0] - '0'; char op = p[1];//始终保存 *p不是* / 的运算符情况。在else中更新 int nNum2 = p[2] - '0'; //2.0 指针指向4位(即:第二个运算符) p += 3; //由于后边p指针是两位两位向后移动,直到字符数组末尾的 '\0' while (*p) { //3.0 已经获取了第一个操作数,现在看第一个操作数和第二个操作数之间的 运算符 if (*p == '*' || *p == '/')//这里判断的始终是下一个运算符 { //3.1 *、/优先级高,所以将第一个操作数和 当前指针下一位计算。并更新 nNum2 为乘法的结果 nNum2 = cal(nNum2, *p, p[1] - '0'); } else//如果下一个是+ - ,那上一个+ - 就可以运算了,op保存了p+2之前的那个运算符 { //3.2 +、- 计算第一个和当前的第二个数,并更新第一个数为结果 nNum1 = cal(nNum1, op, nNum2); op = *p; nNum2 = p[1] - '0'; } p += 2; } return cal(nNum1, op, nNum2);//最后,计算一次最终的num1和最后没有计算的num2 } int main() { //char str[] = "1+2*3/5-6*7"; char str[] = "8+7*2-9/3"; //char str1[] =""; int res = calculate(strlen(str), str); printf("result: %d\n", res); }