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

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

相关文章

SpringBoot @Scheduled Cron表达式使用方式

《SpringBoot@ScheduledCron表达式使用方式》:本文主要介绍SpringBoot@ScheduledCron表达式使用方式,具有很好的参考价值,希望对大家有所帮助,如有... 目录Cron 表达式详解1. 表达式格式‌2. 特殊字符解析3. 常用示例‌4. 重点规则5. 动态与复杂场景‌

Spring Boot 集成 Quartz 使用Cron 表达式实现定时任务

《SpringBoot集成Quartz使用Cron表达式实现定时任务》本文介绍了如何在SpringBoot项目中集成Quartz并使用Cron表达式进行任务调度,通过添加Quartz依赖、创... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

用Java打造简易计算器的实现步骤

《用Java打造简易计算器的实现步骤》:本文主要介绍如何设计和实现一个简单的Java命令行计算器程序,该程序能够执行基本的数学运算(加、减、乘、除),文中通过代码介绍的非常详细,需要的朋友可以参考... 目录目标:一、项目概述与功能规划二、代码实现步骤三、测试与优化四、总结与收获总结目标:简单计算器,设计

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

Python在固定文件夹批量创建固定后缀的文件(方法详解)

《Python在固定文件夹批量创建固定后缀的文件(方法详解)》文章讲述了如何使用Python批量创建后缀为.md的文件夹,生成100个,代码中需要修改的路径、前缀和后缀名,并提供了注意事项和代码示例,... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5.

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�