【每日蓝桥】6、一三年省赛Java组真题“逆波兰表达式”

87 阅读3分钟

这是我参与更文挑战的第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…