后缀表达式(逆波兰)设计计算器

2024-04-13 18:18

本文主要是介绍后缀表达式(逆波兰)设计计算器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

package five_stack.suffix;import java.util.ArrayList;
import java.util.List;
import java.util.Stack;/*** Author:jinpma* Date :2019/12/4*/
public class SuffixDemo {public static void main(String[] args) {//String expression = "111*(32+3)-112";//中缀表达式String expression = "10*(13-3)+5*(2-1)";SuffixDemo suffixDemo = new SuffixDemo();//中缀表达式转化集合形式List<String> list = suffixDemo.changeToList(expression);//中缀表达式集合形式转为后缀表达式List<String> suffixList = suffixDemo.changeToSuffix(list);//对后缀表达式,进行计算int result = suffixDemo.calculate(suffixList);System.out.println(result);}//3.定义方法,计算后缀表达式(字符串)的结果public int calculate(List<String> suffixList){//如果是数字,则压栈Stack<String> stack = new Stack<>();for (String item : suffixList) {if (item.matches("\\d+")) {stack.push(item);}else {//是运算符//1.弹出两个数字,进行运算//2.将运算结果再压栈int num1 = Integer.parseInt(stack.pop());int num2 = Integer.parseInt(stack.pop());int res = 0;switch (item){case "+":res = num1 + num2;break;case "-":res = num2 - num1;//减法:后出栈的-先出栈的break;case "*":res = num1 * num2;break;case "/":res = num2 / num1;//除法:后出栈的-先出栈的break;default:break;}//将运算结果压栈stack.push(""+res);//res为int类型,Stack<String>}}return Integer.parseInt(stack.pop());//栈中最后一个元素即为最终结果}//2.定义方法,将中缀表达式集合形式转换为后缀表达式public List<String> changeToSuffix(List<String> list){//1.定义栈和集合Stack<String> s1 = new Stack<>();List<String> s2 = new ArrayList<>();//2.遍历中缀集合!!!集合元素全部为字符串for (String item : list) {//2.1如果是数字(字符串),则直接加入s2if (item.matches("\\d+")) {//注意:整数的正则表达式为\\d+s2.add(item);//2.2如果是左括号,直接压栈s1    } else if (item.equals("(")) {s1.push(item);//2.3如果是右括号,则将s1的运算符弹出,并加入s2,直到遇到(左括号为止,并将这一对括号删除    } else if (item.equals(")")) {while (! s1.peek().equals("(")) {//注意:判断条件只是看一下栈顶元素有没有到(左括号,并不需要弹出,只需要peek()一下s2.add(s1.pop());}s1.pop();//将左括号弹栈,一对()被消除//2.4若为运算符    //若item的优先级<=栈中运算符,则将栈中运算符弹出,并且加入s2,这里也不是弹出后比较优先级,而是peek()} else{//定义方法property用于判断运算符优先级while (s1.size() != 0 && property(item) <= property(s1.peek())){//!!!注意!!!循环弹出栈,需要判断栈是否为空s2.add(s1.pop());}s1.push(item);//将item压栈}}//3.for循环执行结束,将s1中元素,全部弹出到s2中while (s1.size() != 0) {s2.add(s1.pop());}return s2;}//2.1定义运算符优先级public int property(String item){int res = 0;switch(item){case "+":res = 1;break;case "-":res = 1;break;case "*":res = 2;break;case "/":res = 2;break;}return res;}//1.定义方法,将中缀表达式转换为集合形式public List<String> changeToList(String str){List<String> list = new ArrayList<>();char ch ;//装载每个遍历出来的元素String con;//用于多位数数字的拼接(防止111加入集合中变成[1,1,1])//遍历字符串for (int i = 0; i < str.length(); i++) {if ((ch = str.charAt(i)) >57 || (ch) < 48) {//非数字,运算符或者()list.add(""+ch);}else {//数字,注意多位数的拼接con = "";//这一次的多位数拼接,需要将上一次的数字(字符串)先清除//满足拼接的判断条件(不是最后一个元素且是数字)while ( i < str.length() && (ch = str.charAt(i)) >= 48 && (ch) <= 57 ) {//拼接多位数con += ch;i++;}list.add(con);//!!!特别重要的事,当i+1之后去while中判断,当不满足条件时,i+1(非数字)就被自动跳过了(不会执行if了)i--;//while中i++,for中i++,导致数字后的非数字字符被跳过了}}return list;}
}

这篇关于后缀表达式(逆波兰)设计计算器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/900860

相关文章

Python19 lambda表达式

在 Python 中,lambda 表达式是一个小型匿名函数,通常用于实现简单、单行的函数。lambda 函数可以接受任意数量的参数,但只能有一个表达式。 基本语法: lambda arguments: expression 这里,arguments 是传递给 lambda 的参数,expression 是关于这些参数的表达式,它的计算结果就是 lambda 函数的返回值。 使用

java8的新特性之一(Java Lambda表达式)

1:Java8的新特性 Lambda 表达式: 允许以更简洁的方式表示匿名函数(或称为闭包)。可以将Lambda表达式作为参数传递给方法或赋值给函数式接口类型的变量。 Stream API: 提供了一种处理集合数据的流式处理方式,支持函数式编程风格。 允许以声明性方式处理数据集合(如List、Set等)。提供了一系列操作,如map、filter、reduce等,以支持复杂的查询和转

在线装修管理系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,装修队管理,用户管理,装修管理,基础数据管理,论坛管理 前台账户功能包括:系统首页,个人中心,公告信息,论坛,装修,装修队 开发系统:Windows 架构模式:B/S JDK版本:Java JDK1.8 开发工具:IDEA(推荐) 数据库版本: mysql5.7 数据库可视化工具: navicat 服务器:SpringBoot自带 ap

DDei在线设计器-API-DDeiSheet

DDeiSheet   DDeiSheet是代表一个页签,一个页签含有一个DDeiStage用于显示图形。   DDeiSheet实例包含了一个页签的所有数据,在获取后可以通过它访问其他内容。DDeiFile中的sheets属性记录了当前文件的页签列表。   一个DDeiFile实例至少包含一个DDeiSheet实例。   本篇最后提供的示例可以在DDei文档直接预览 属性 属性名说明数

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页:

比较学习难度:Adobe Illustrator、Photoshop和新兴在线设计平台

从入门设计开始,几乎没有人不知道 Adobe 公司两大设计软件:Adobe Illustrator和 Photoshop。虽然AI和PS很有名,有一定设计经验的设计师可以在早期探索和使用后大致了解AI和PS的区别,但似乎很少有人会系统地比较AI和PS。目前,设计软件功能多样,轻量级和网页设计软件已成为许多设计师的需求。对于初学者来说,一篇有针对性的AI和PS比较总结文章具有非常重要的指导意义。毕竟

基于Java医院药品交易系统详细设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝10W+,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码+数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人  Java精品实战案例《600套》 2023-2025年最值得选择的Java毕业设计选题大全:1000个热

展厅设计主要的六大要素

1、从创意开始      展示设计的开始必须创意在先。根据整体的风格思路进行创意,首先要考虑的是主体的造型、大小高度位置以及它和周围展厅的关系。另外其他道具设计制作与运作方式也必须在创意中有明确的体现。      2、平面感      平面感是指对展示艺术设计平面图纸审美和功能两个方面理性的感觉认识。它是三维空间设计认识的基础,也是施工的重要依据。展示空间的设计应先在展场环境的平面

办理河南建筑工程乙级设计资质的流程与要点

办理河南建筑工程乙级设计资质的流程与要点 办理河南建筑工程乙级设计资质的流程与要点主要包括以下几个方面: 流程: 工商注册与资质规划:确保企业具有独立法人资格,完成工商注册,并明确乙级设计资质的具体要求,包括注册资本、人员配置、技术条件等。 专业技术人员配置: 雇佣或签约符合资质要求的专业技术人员,包括但不限于:一级注册结构工程师2名、一级注册建筑师2名、注册暖通工程师1名、注册供配电工

CSS背景属性:打造丰富视觉效果的背景设计

在网页设计中,背景是创建视觉吸引力和设置页面基调的重要元素。CSS提供了多种背景属性来控制元素的背景样式,包括颜色、图像、尺寸、位置和重复方式。本文将详细介绍CSS中的背景属性,包括background简写属性以及background-color、background-image、background-repeat、background-position和background-size等属性。