这是我参与更文挑战的第20天,活动详情查看: [更文挑战]
你好呀,我是灰小猿,一个超会写bug的程序猿!
欢迎大家关注我的专栏“每日蓝桥”,该专栏的主要作用是和大家分享近几年蓝桥杯省赛及决赛等真题,解析其中存在的算法思想、数据结构等内容,帮助大家学习到更多的知识和技术!
标题:逆波兰表达式
正常的表达式称为中缀表达式,运算符在中间,主要是给人阅读的,机器求解并不方便
例如:3 + 5 *(2 + 6)- 1
而且常常需要使用括号来该表运算次序,
相反,如果使用逆波兰表达式(前缀表达式)表示,上面的算式则为:
- + 3 * 5 + 2 6 1
不再需要括号,机器可以使用递归的方法很方便的求解
为了简便,我们假设:
1、只有 + - * 三种运算符
2、每一运算数都是一个小于10的非负整数
下面的程序对一个逆波兰表示串进行求值,
其返回值为一个数据:其中第一元素表示求值结果,第二元素表示它已解析的字符数
static int [] evaluste(String x) {
if (x.length()==0) {
return new int[] {0,0};
}
char c = x.charAt(0);
if (c>='0'&&c<='9') {
return new int[] {c-'0',1};
}
int[] v1 = evaluste(x.substring(1));
int[] v2 = _________________________________; //填空位置
int v = Integer.MAX_VALUE;
if(c=='+') v = v1[0] + v2[0];
if(c=='*') v = v1[0] * v2[0];
if(c=='-') v = v1[0] - v2[0];
return new int[] {v,1 + v1[1] + v2[1]};
}
请分析代码逻辑,并推测划线处的代码,通过网页提交
注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或者说明文字!!!
解题思路:
本题在解题上的关键就是通读题干中的源码,理解每一行所要实现的具体功能,之后了解该程序设计的主要思路,根据题干中的要求把空白处补全就可以了,
关于源码的具体解释可以看下面的答案。
答案源码:
package 一三年省赛真题; public class Year2013_t6 { public static void main(String[] args) { //原式子:3+5*(2+6)-1=42 int a[] = evaluste("-+3*5+261"); System.out.println(a[0]); } /** * 逆波兰表达式函数 * -+3*5+261 * @param x 传入的逆波兰表达式 * */ static int [] evaluste(String x) { //如果传入的字符串长度为0,说明该字符串无效 if (x.length()==0) { return new int[] {0,0}; } char c = x.charAt(0); //获取到字符串的第一个字符 if (c>='0'&&c<='9') { //判断该字符是不是数字 return new int[] {c-'0',1}; //如果是数字,返回该数字和处理的字符数 } int[] v1 = evaluste(x.substring(1)); //如果第一个字符是运算符,截取后面的部分 int[] v2 = evaluste(x.substring(1+v1[1])); //填空位置 截取上一步没有截取到的部分 int v = Integer.MAX_VALUE; //根据第一个字符的类型。对后面返回的结果进行处理 if(c=='+') v = v1[0] + v2[0]; if(c=='*') v = v1[0] * v2[0]; if(c=='-') v = v1[0] - v2[0]; return new int[] {v,1 + v1[1] + v2[1]}; //返回处理结果 } }
输出样例:
其中有不足或者改进的地方,还希望小伙伴留言提出,一起学习!
感兴趣的小伙伴可以关注专栏!
灰小猿陪你一起进步!
最后,我正在参加2020年度博客之星的评选,求小伙伴们帮忙投票支持一下哟!
投票链接:bss.csdn.net/m/topic/blo…