栈的应用-四则运算(中缀与后缀表达式转换--Java源码)

2024-06-18 16:18

本文主要是介绍栈的应用-四则运算(中缀与后缀表达式转换--Java源码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考链接
结合原文章,做了一定修改,增加Java源码实现

    • 1. 概述
    • 2. 后缀表达式计算
    • 3. 中缀表达式转后缀表达式
    • 4. 源代码实现


1. 概述

对于四则运算表达式的计算,是输入数据结构中栈的应用,即重点是中缀表达式转换为后缀表达式


2. 后缀表达式计算

  • 为了解释后缀表达式的好处,我们先来看看,计算机是如何计算后缀表达式的
  • 后缀表达式实例9 3 1 - 3 * + 10 2 / +
  • 计算规则:从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到是符号,就将处于栈顶的两个数字出栈,进行计算,然后计算结果进栈,一直到最终获得结果。
  • 计算过程:


3. 中缀表达式转后缀表达式

我们把平时标准的四则运算表达式比如9+(3-1)*3+10/2叫做中缀表达式。
中缀表达式:9+(3-1)*3+10/2转换后缀表达式9 3 1 - 3 * + 10 2 / +

  • 转换规则

    1. 当当前字符为数字时,直接输出;
    2. 当当前字符为(时,将其压栈;
    3. 当当前字符为)时,则弹出堆栈中最上的(之前的所有运算符并输出,然后删除堆栈中的(
    4. 当当前字符为运算符时,则依次弹出堆栈中优先级大于等于当前运算符的(到”(“之前为止),输出,再将当前运算符压栈;
      最后弹出所有栈中的内容输出
  • 转换过程





4. 源代码实现

package data_structure;import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** 栈的应用* https://blog.csdn.net/u011857433/article/details/79993385* 四则运算表达式求职,中缀表达式与后缀表达式转换*/
public class ReversePoland {public static void main(String[] args) {//        Calculation1("9 3 1 - 3 * + 10 2 / +");System.out.println(Calculation2("9 + ( 3 - 1 ) * 3 + 10 / 2"));}/*** 计算后缀表达式* @param inputString 9 3 1 - 3 * + 10 2 / + 以空格分隔*/public static int Calculation1(String inputString){String[] input = inputString.split(" ");Stack<Integer> stack = new Stack<>();for (int i = 0; i < input.length; i++) {String s = input[i];if (isNumber(s))  //如果是数字,则入栈stack.push(Integer.valueOf(s));else {//遇到运算符,则从栈中弹出两个数字,进行运算int n1 = stack.pop();int n2 = stack.pop();int res = 0;switch (s){case "+":res = n1 + n2;break;case "-":res = n2 - n1;break;case "*":res = n1 * n2;break;case "/":res = n2 / n1;break;}stack.push(res);}}return stack.pop();}/*** 将中缀表达式转化为后缀表达式* @param string 9 + ( 3 - 1 ) * 3 + 10 / 2* @return*/public static String Calculation2(String string){Stack<String> stack = new Stack();String[] chars = string.split(" ");String res = "";for (int i = 0; i < chars.length; i++) {String s = String.valueOf(chars[i]);if (isNumber(s)){if (res.length()==0)res += s;elseres += " "+s;}else {if (s.equals("(")){stack.push(s);}else {if (s.equals(")")){String t = "";String s1 = "";while (!(t = stack.pop()).equals("(")){s1 += " "+t;}res += s1;}else {int priority = getPriority(s);String s1 = "";boolean flag = false;while (!stack.empty()){flag = false;s1 = stack.pop();if (s1.equals("(")){
//                                stack.push("(");break;}if (getPriority(s1) >= priority){res += " " + s1;flag = true;}}if (!s1.equals("") && !flag)stack.push(s1);stack.push(s);}}}}while (!stack.empty()){res += " " + stack.pop();}return res;}//获取运算符的优先级public static int getPriority(String s){Map<String,Integer> map = new HashMap<>();map.put("+",0);map.put("-",0);map.put("*",1);map.put("/",1);map.put("(",2);map.put(")",2);return map.get(s);}public static boolean isNumber(String c){Pattern pattern = Pattern.compile("^(0|[1-9][0-9]*)$");Matcher matcher = pattern.matcher(c);boolean res = matcher.find();return res;}
}

这篇关于栈的应用-四则运算(中缀与后缀表达式转换--Java源码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Spring MVC如何设置响应

《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header... 目录1. 返回静态页面1.1 Spring 默认扫描路径1.2 @RestController2. 返回 html2

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Spring核心思想之浅谈IoC容器与依赖倒置(DI)

《Spring核心思想之浅谈IoC容器与依赖倒置(DI)》文章介绍了Spring的IoC和DI机制,以及MyBatis的动态代理,通过注解和反射,Spring能够自动管理对象的创建和依赖注入,而MyB... 目录一、控制反转 IoC二、依赖倒置 DI1. 详细概念2. Spring 中 DI 的实现原理三、