第四届蓝桥杯省赛,是一道结果填空题,大体的题意就是给你一个前缀表示的算式,补充程序使计算机能正确计算。前缀表达式如下:
-+3*5+261
那么,你当然是看不懂的,对应的人类写法如下:
3+5*(2+6)-1
这不重要,只是为了最后验证而已。还是个递归的程序,方法主体如下
if(s.length()==0) return new int[]{0,0};
char c=s.charAt(0);
if(c>='0'&&c<='9'){return new int[]{c-'0',1};
}
int[] v1=evaluate(s.substring(1));
int[] v2=evaluate(?);
int v=Integer.MAX_VALUE;
if(c=='+'){v=v1[0]+v2[0];
}else if(c=='-'){v=v1[0]-v2[0];
}else {v=v1[0]*v2[0];
}
return new int[]{v,1+v1[1]+v2[1]};
那么重要的就是理解v1,v2是什么东西?这两个数组的第一个元素可以相加减,那么说明是个子算式的值。然后就是第二个元素的事了,那么说到递归,方法中只传了一个字符串,玩不好可是要StackOverFlowError的。所以肯定有个索引,当然我们根据给出的代码v1=evaluate(s.substring(1))可以看到这里不是索引的概念,而是子串的概念。那么v2肯定也是个子算式的值,所谓前缀表达式,就是操作符在前,操作数在后。那么第一个操作数就是v1[0],第二个操作数不出意外就是v2[0]。
所以想得到v2[0]就直接解析后面的表达式就行,那么程序需要知道要解析v2[0]该从哪个字符开始,这就是v1[1]的作用。那么v2的起始位置就是v1的终止位置+1。然后我们假设表达式为“-82”,走一遍程序
if(c>='0'&&c<='9'){return new int[]{c-'0',1};
}
得到v1的值后返回的v1[1]是1,而要得到v2[1]=2,我们需要s.substring(v1[1]+1),这是一个野办法(不想分析长的就自己造个短的分析下)。为什么要+1呢?因为在前缀表达式中,最前面肯定有个操作符。