1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| //根据给定的后缀表达式 postexp,计算它的值 typedef struct { double data[MAXSIZE]; int top; } Stack_num;
void InitStack_num(Stack_num **s) { *s = (Stack_num *)malloc(sizeof(Stack_num)); (*s)->top = -1; }
bool Push_num(Stack_num **s, double e) { if ((*s)->top == MAXSIZE - 1) return false; (*s)->top++; (*s)->data[(*s)->top] = e; return true; }
bool Pop_num(Stack_num **s, double *e) { if ((*s)->top == -1) return false; *e = (*s)->data[(*s)->top]; (*s)->top--; return true; }
//计算后缀表达式的值 double compvalue(char *postexp) { Stack_num *num; int i = 1; double result; double a, b; double c; double d; InitStack_num(&num); //依次扫描整个表达式 while (*postexp != '\0') { switch (*postexp) { case '+': Pop_num(&num, &a); Pop_num(&num, &b); //计算 b+a 的值 c = b + a; Push_num(&num, c); break; case '-': //计算 b-a 的值 Pop_num(&num, &a); Pop_num(&num, &b); c = b - a; Push_num(&num, c); break; case '*': Pop_num(&num, &a); Pop_num(&num, &b); //计算 b*a 的值 c = b * a; Push_num(&num, c); break; case '/': Pop_num(&num, &a); // a是除数 Pop_num(&num, &b); //计算 b/a 的值 if (a != 0) { c = b / a; Push_num(&num, c); } else { printf("除0错误!\n"); exit(0); } break; case '^': Pop_num(&num, &a); // a是指数 Pop_num(&num, &b); //计算 b^a 的值 if (a != 0) { i = 1; c = 1; while (i <= a) { c = c * b; i++; } } else if (b != 0) { c = 1; } else { c = 0; } Push_num(&num, c); break; case '!': Pop_num(&num, &a); //计算 a! 的值 c = 1; i = a; while (i != 0) { c = c * i; i--; } Push_num(&num, c); break; default: //如果不是运算符,就只能是字符形式的数字,将其转换成对应的整数 d = 0; while (*postexp >= '0' && *postexp <= '9') { d = 10 * d + (*postexp - '0'); postexp++; } Push_num(&num, d); } postexp++; //继续下一个字符 } Pop_num(&num, &result); return result; }
|