6

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

 3 years ago
source link: https://blog.csdn.net/weixin_44985880/article/details/112678377
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

original.png
灰小猿 2021-01-15 17:20:28 articleReadEyes.png 466

你好呀,我是灰小猿,一个超会写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]};

请分析代码逻辑,并推测划线处的代码,通过网页提交

注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或者说明文字!!!

解题思路:

本题在解题上的关键就是通读题干中的源码,理解每一行所要实现的具体功能,之后了解该程序设计的主要思路,根据题干中的要求把空白处补全就可以了,

关于源码的具体解释可以看下面的答案。

答案源码:

输出样例:

20210115171831209.png

其中有不足或者改进的地方,还希望小伙伴留言提出,一起学习!

感兴趣的小伙伴可以关注专栏!

灰小猿陪你一起进步!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK