巨大八爪鱼
武林盟主 二十一级
|
对于:-+3*5+261 其计算过程如下: ev: {0, 0} -> {42, 9} x: -+3*5+261 v1: {43, 7} { ev: {0, 0} -> {43, 7} x: +3*5+261 v1: {3, 1} { ev: {0, 0} -> {3, 1} x: 3*5+261 } v2: {40, 5} { ev: {40, 5} x: *5+261 v1: {5, 1} { ev: {0, 0} -> {5, 1} x: 5+261 } v2: {8, 3} { ev: {0, 0} -> {8, 3} x: +261 v1: { ev: {0, 0} -> {2, 1} x: 261 } v2: { ev: {6, 1} x: 61 } ev.result = 2 + 6 = 8 ev.n = 1(加号本身) + 1 + 1 = 3 } ev.result = 5 * 8 = 40 ev.n = 1(乘号本身) + 1 + 3 = 5 } ev.result = 3 + 40 = 43 ev.n = 1 + 1 + 5 = 7 } v2: {1, 1} { ev: {0, 0} -> {1, 1} x: 1 } ev.result = 42 ev.n = 1 + 7 + 1 = 9 return {42, 9}
|
巨大八爪鱼
武林盟主 二十一级
|
对于表达式: -+3*5+261 (也就是3 + 5 * (2 + 6) - 1) 其中的运算符为:-+*+ 颠倒过来就是:+*+- 可见这个顺序和要求的实际表达式的运算符顺序是一模一样的。
|
巨大八爪鱼
武林盟主 二十一级
|
#include <stdio.h> #include <stdlib.h>
#define _____________________________ evaluate(x + v1.n + 1)
struct EV { int result; //计算结果 int n; //消耗掉的字符数 };
struct EV evaluate(char* x) { struct EV ev = {0,0}; struct EV v1; struct EV v2;
if(*x==0) return ev; if(x[0]>='0' && x[0]<='9'){ ev.result = x[0]-'0'; ev.n = 1; return ev; } v1 = evaluate(x+1); v2 = _____________________________; //填空位置 if(x[0]=='+') ev.result = v1.result + v2.result; if(x[0]=='*') ev.result = v1.result * v2.result; if(x[0]=='-') ev.result = v1.result - v2.result; ev.n = 1+v1.n+v2.n;
return ev; }
int main(void) { struct EV e = evaluate("-+3*5+261"); printf("=%d, %d\n", e.result, e.n); system("pause"); return 0; }
|
巨大八爪鱼
武林盟主 二十一级
|
对于递归函数的填空题,一般都采用蒙参数的方法
|