当前位置: 首页 > news >正文

CC2-后缀表达式求值

目录

一、题目描述

二、解题思路

(一)栈的核心作用

(二)算法步骤

三、代码实现

(一)完整代码

(二)代码解释

四、测试结果

五、总结


一、题目描述

计算逆波兰式(后缀表达式)的值。运算符仅包含 +-* 和 /,操作数是整数,保证表达式合法,除法时向下取整。

示例:

  • 输入:["20", "10", "+", "30", "*"],计算过程为 (20 + 10) * 30,返回值:900
  • 输入:["40", "130", "50", "/", "+"],计算过程为 40 + (130 / 50),返回值:42
  • 输入:["20"],返回值:20

二、解题思路

(一)栈的核心作用

利用栈来存储操作数。遍历后缀表达式的每个元素,当遇到操作数时,将其入栈;当遇到运算符时,从栈中弹出两个操作数,进行相应运算后,再将结果入栈。遍历结束后,栈中仅剩的元素就是后缀表达式的计算结果。

(二)算法步骤

  1. 初始化栈:创建一个整数类型的栈,用于存储操作数。
  2. 遍历后缀表达式:对于每个元素 token
    • 如果是操作数(即不是 +-*/),将其转换为整数后入栈。
    • 如果是运算符:
      • 弹出栈顶的两个操作数,注意弹出的顺序,先弹出的是右操作数,后弹出的是左操作数。
      • 根据运算符进行相应计算(+-*/),并将计算结果入栈。
  3. 返回结果:遍历结束后,栈中唯一的元素就是后缀表达式的计算结果,将其弹出并返回。

三、代码实现

(一)完整代码

import java.util.*;public class Solution {/*** @param tokens string字符串一维数组,后缀表达式* @return int整型,表达式计算结果*/public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack<>();for (String token : tokens) {if (token.equals("+")) {stack.push(stack.pop() + stack.pop());} else if (token.equals("-")) {// 注意顺序,先弹出的是右操作数,后弹出的是左操作数,所以是左 - 右int right = stack.pop();int left = stack.pop();stack.push(left - right);} else if (token.equals("*")) {stack.push(stack.pop() * stack.pop());} else if (token.equals("/")) {// 除法向下取整,同样注意操作数顺序,左 / 右int right = stack.pop();int left = stack.pop();stack.push(left / right);} else {stack.push(Integer.parseInt(token));}}return stack.pop();}// 测试代码public static void main(String[] args) {Solution solution = new Solution();// 测试示例1String[] tokens1 = {"20", "10", "+", "30", "*"};int result1 = solution.evalRPN(tokens1);System.out.println("示例1结果:" + result1);// 测试示例2String[] tokens2 = {"40", "130", "50", "/", "+"};int result2 = solution.evalRPN(tokens2);System.out.println("示例2结果:" + result2);// 测试示例3String[] tokens3 = {"20"};int result3 = solution.evalRPN(tokens3);System.out.println("示例3结果:" + result3);}
}

(二)代码解释

  • evalRPN 方法:核心方法,按照上述解题思路,利用栈实现后缀表达式的求值。在处理减法和除法时,要特别注意操作数的顺序,先弹出的是右操作数,后弹出的是左操作数。
  • main 方法:用于测试,分别构建了题目中的示例以及单个操作数的情况,调用 evalRPN 方法计算结果并输出。

四、测试结果

运行测试代码,输出结果为:

示例1结果:900
示例2结果:42
示例3结果:20

与题目示例的预期结果一致,说明代码正确实现了后缀表达式的求值。

五、总结

通过栈这种数据结构,我们高效地解决了后缀表达式的求值问题。栈的 “后进先出” 特性完美契合了后缀表达式的计算逻辑,在遇到运算符时,能够方便地获取到所需的操作数进行计算。这种利用栈解决表达式求值的方法,在编译原理等领域也有广泛应用,掌握它有助于理解更复杂的表达式处理过程。

http://www.dtcms.com/a/488304.html

相关文章:

  • 北京住房和城乡建设厅网站六安市网站建设
  • 河北网站开发多少钱广州移动网站开发
  • 深入理解 malloc:ptmalloc 机制、堆布局与内核映射
  • 湖南网站建设360o重庆所有做网站的公司有哪些
  • 使用 Gorm 框架连接达梦数据库实战指南
  • 大模型—AIGC应用:基于RAG构建个人知识库
  • VSCode高效使用完全指南:提升开发效率的系统化实践
  • anaconda vscode python 安装配置
  • c2c模式流程图枣庄seo推广
  • 从冷call到暖聊:AI情感电销革命
  • 织梦cms如何做网站丹阳网站建设制作
  • 合肥做网站专家网页设计心得体会600
  • 成都医院手机网站建设私人架设服务器
  • 网站开发教程图文石家庄又封了
  • point-transformer模型tensorrt推理部署
  • 用PDH库获取CPU使用率(源码)
  • 展示型网站一样做seo优化吗华为云建站和阿里云建站区别
  • 《扫雷:病毒蔓延》- 颠覆传统的动态扫雷游戏
  • phpwind做的网站wordpress 双分页
  • 西宁网站制作公司专业wordpress主题开发
  • 前端与后端开发详解:从概念到就业技能指南_前后端开发
  • Java业务异常处理最佳实践
  • 电子商务网站开发教程课后答案做公众号策划的网站
  • 小程序自助建站wordpress您的密码重设链接无效
  • 龙华网站建设主要工作广东省住房和城乡建设局网站
  • 建设企业网站得花多少钱成都 网站开发公司
  • 深圳制作企业网站的公司网站项目策划书模板
  • 为什么要尽量将MySQL表字段要设置为NOT NULL?
  • 数据结构与算法(递归)
  • 「深度学习笔记2」线性代数——深度学习的“骨架”