java中缀表达式转后缀表达式

【数据结构】java实现中缀表达式转后缀表达式计算器 01 后缀表达式介绍 后缀表达式 这种表示方式把运算符写在运算对象的后面,例如,把a+b写成ab+,所以也称为后缀式。这 02 中缀表达式转后缀表达式 中缀表达式转后缀表达式 初始化两个栈,运算符栈s1和中间结果栈s2 2.1 代码实现 因为String形式的算式不方便处理,首先将不带空格的中缀表达式添加到一个list里 // 将不带空格的中缀表达式转换成list public static List<String>... 阅读详情
将中缀表达式转换为后缀表达式:
与转换为前缀表达式相似,遵循以下步骤:
(1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2;
(2) 从左至右扫描中缀表达式;
(3) 遇到操作数时,将其压入S2;
(4) 遇到运算符时,比较其与S1栈顶运算符的优先级:
(4-1) 如果S1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;
(4-2) 否则,若优先级比栈顶运算符的高,也将运算符压入S1(注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况);
(4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较;
(5) 遇到括号时:
(5-1) 如果是左括号“(”,则直接压入S1;
(5-2) 如果是右括号“)”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到左括号为止,此时将这一对括号丢弃;
(6) 重复步骤(2)至(5),直到表达式的最右边;
(7) 将S1中剩余的运算符依次弹出并压入S2;

(8) 依次弹出S2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式(转换为前缀表达式时不用逆序)。

import java.util.Stack;

public class Calculator {

	public static void main(String[] args) {
		suffixCalc("1+((2+3)*4)-5");
	}
	public static void suffixCalc(String input) {
		Stack<Double> numbersStack = new Stack<Double>();
		Stack<Character> operatorsStack = new Stack<Character>();
		Stack<Object> suffixExpr = new Stack<Object>();
		int len = input.length();
		char c, temp;
		double number;
		for (int i = 0; i < len; i++) {
			c = input.charAt(i);
			if (Character.isDigit(c)) {
				int endDigitPos = getEndPosOfDigit(input, i);
				number = Double.parseDouble(input.substring(i, endDigitPos));
				i = endDigitPos - 1;
				numbersStack.push(number);
				if ((int)number == number) {
					suffixExpr.push((int)number);
				} else {
					suffixExpr.push(number);
				}
			} else if (isOperator(c)) {
				// 操作符栈非空,且栈顶不是'(',且当前操作符优先级低于栈顶操作符
				while (!operatorsStack.isEmpty() 
						&& operatorsStack.peek() != '(' 
						&& priorityCompare(c, operatorsStack.peek()) <= 0) {
					suffixExpr.push(operatorsStack.peek());
					numbersStack.push(calc(numbersStack, operatorsStack.pop()));
				}
				operatorsStack.push(c);
			} else if (c == '(') {
				operatorsStack.push(c);
			} else if (c == ')') {
				while ((temp = operatorsStack.pop()) != '(') {
					numbersStack.push(calc(numbersStack, temp));
					suffixExpr.push(temp);
				}
			} else if (c == ' ') {
				
			} else {
				throw new IllegalArgumentException("wrong character '" + c + "'");
			}
		}
		
		while (!operatorsStack.isEmpty()) {
			temp = operatorsStack.pop();
			suffixExpr.push(temp);
			numbersStack.push(calc(numbersStack, temp));
		}
		
		printStack(suffixExpr);
		System.out.println("\ncalc result\t" + numbersStack.pop());
	}
	
	private static void printStack(Stack<?> stack) {
		String s = "";
		while (!stack.isEmpty()) {
			s += stack.pop();
		}
		for (int i = s.length()-1; i >= 0; i--) {
			System.out.print(s.charAt(i)+" ");
		}
	}

	private static int getEndPosOfDigit(String input, int start) {
		char c;
		int end = start + 1;
		for (int i = start + 1; i < input.length(); i++) {
			c = input.charAt(i);
			if (Character.isDigit(c) || c == '.') {
				continue;
			} else {
				end = i;
				break;
			}
		}
		return end;
	}

	private static boolean isOperator(char c) {
		return (c == '+' || c == '-' || c == '*' || c == '/');
	}

	// op1优先级高于op2 return 1
	private static int priorityCompare(char op1, char op2) {
		switch (op1) {
		case '+':
		case '-':
			return (op2 == '*' || op2 == '/' ? -1 : 0);
		case '*':
		case '/':
			return (op2 == '+' || op2 == '-' ? 1 : 0);
		}
		return 1;
	}

	private static double calc(Stack<Double> numbersStack, char op) {
		double num1 = numbersStack.pop();
		double num2 = numbersStack.pop();
		return calc(num2, num1, op);
	} 
	private static double calc(double num1, double num2, char op) throws IllegalArgumentException {
		switch (op) {
		case '+':
			return num1 + num2;
		case '-':
			return num1 - num2;
		case '*':
			return num1 * num2;
		case '/':
			if (num2 == 0)
				throw new IllegalArgumentException("divisor can't be 0.");
			return num1 / num2;
		default:
			return 0;
		}
	}
}

output:

1 2 3 + 4 * + 5 - 
calc result 16.0

道闸不自动落杆故障排查:从传感器原理到控制器调试全解析 在工业自动化和物联网系统中,传感器与控制器构成的闭环控制是保障设备可靠运行的核心。其基本原理是通过传感器采集环境状态,控制器依据预设逻辑做出决策并驱动执行器动作。这一技术价值在于实现了无人值守下的安全、高效自动化,广泛应用于智能交通、安防和智能楼宇等领域。以停车场道闸系统为例,其自动落杆功能高度依赖地感线圈与防砸雷达的协同。地感线圈作为触发单元,负责感知车辆接近;而防砸雷达则作为持续监测的安全单元,通过微波探测防砸区域内是否有障碍物,其信号是控制器执行落杆决策的关键依据。当系统出现车辆通过后闸杆不落的典型故 阅读详情

相关推荐

手把手教你用Arduino和开源电路DIY一个手机连接的电化学传感器(附GitHub源码)

本文详细介绍了如何利用Arduino和开源电路DIY一个手机连接的电化学传感器,成本不到300元即可复现价值数千元的专业设备。从硬件选型、电路搭建到固件开发和手机应用实现,手把手教你完成整个项目,特别适合科研人员、环境监测爱好者和理工科学生。附GitHub源码,方便快速上手和扩展功能。

weixin_42561040的博客 336

数据结构——前缀、中缀、后缀表达式实现和转换(Java)

前缀表达式,中缀表达式,后缀表达式,前缀表达式计算器,后缀表达式计算器,中缀表达式转化后缀表达式。

m0_52861211的博客 3888

从东南大学906被刷到调剂过程(内含个人感想)

介绍了自己在看到初试成绩,到后期复习以及调剂的全过程,当中也包含了自己的复试中的感想,希望大家理性看待。

Philo的博客 2854

Java实现中缀表达式转后缀表达式

逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后)在实现中缀转后缀之前我们先了解后缀表达式的实现,学习过编译原理这门的课程的同学,应该对逆波兰式非常的熟悉哈,没错他就是后缀表达式。

Code Writers 636

华为HCIP-001:PPPOE配置模拟实验

华为HCIP01:PPPOE配置模拟实验 实验环境 pppoe-client上面的接口信息 [AR1]dis ip interface brief *down: administratively down ^down: standby (l): loopback (s): spoofing The number of interface that is UP in Physical is 2 The number of interface that is DOWN in Physical is 1 Th

兔子乖乖 1797

STM32F103ZET6【标准库函数开发】------04五个串口配置实战:从零到一构建多串口通信系统

本文详细介绍了STM32F103ZET6标准库函数开发中五个串口(USART/UART)的配置实战,从硬件引脚识别、时钟树配置到多串口系统整合技巧。通过具体代码示例和调试经验,帮助开发者快速构建稳定的多串口通信系统,适用于工业控制、物联网网关等应用场景。

weixin_29188997的博客 343

Java实现中缀式转为后缀式

中缀式向后缀式转化时,会使用栈这种结构来存储符号;而对于数字则是直接输出,转换的规则如下:规则:从左向右扫描遇到数字,直接输出遇到'(',直接入栈遇到')',进行括号匹配——符号依次出栈,直到遇到'('若当前符号优先级大于栈顶元素,则当前符号入栈若当前符号优先级小于、等于栈顶符号,栈顶符号依次出栈,直到当前符号优先级大于栈顶元素(或符号栈为空),将其入栈遍历结束后,判断符号栈中是否还有元素,若有,将其全部输出即可这样就完成了中缀式向后缀式的转换代码如下:......

Huan-xian的博客 693

游戏战斗系统架构设计的演绎之路——从一坨意大利面条到一座精密钟表

摘要:游戏战斗系统架构设计的演进之路 本文系统梳理了游戏战斗系统从早期街机到现代3A大作的架构发展历程。70-80年代的街机游戏采用基础碰撞盒判定(如《街头霸王》);90年代实现动画融合与状态机架构(《最终幻想》《拳皇》);2000年后MMO引入服务器验证与同步技术(《魔兽世界》);3D时代融合物理引擎与智能AI(《GTA5》《只狼》);移动端则发展出轻量化架构与云端判定(《王者荣耀》)。现代战斗系统已实现模块化、数据驱动和热更新,未来趋势是AI裁判与云战斗系统。这一演进过程展现了技术与创意的完美结合,数百

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 800

Java、将中缀转换为后缀

代码】Java、将中缀转换为后缀。

m0_62659797的博客 314

【Go语言实战】(26) 分布式搜索引擎

基于go语言的分布式搜索引擎

面向生活编程 2379

【人工智能】Spring AI项目在定义 `response_format` 的 Invalid schema for response_format ‘custom_schema‘

确保。

奶爸的编程之路,也就一周冷个三天 560

Java-中缀表达式转后缀

本文先给出思路与方法,最后将给出完整代码 项目实战: https://blog.youkuaiyun.com/qq_43377749/article/details/84973206 算法综述: 一、中缀表达式转后缀表达式: 1.中缀表达式要转后缀表达式,首先需要两个Stack(栈),其中一个应用于存放字符,另一个用于存放数字。 2.读到数字直接存入数字栈中,读到字符时,要咸鱼栈内前一元素(字符)...

圆号本号 623

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java实现多功能中缀表达式转后缀表达式并求值

代码实现带括号,多位数,小数,正负数的四则,取余,以及三角函数和反三角函数运算。

2201_75317009的博客 2170

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

基于Java的中缀表达式转后缀表达式设计

4、为以上的 Java 程序提供一个随机测试数据发生器(用 Java 语言来写),生成若干随机的正确表达式和不正确表达式(通过命令行参数决定是生成正确的还是不正确的以及生成的数量)。1、实现一个完整的 Java 程序,它读取文件中的中缀表达式(每个表达式以分号结束,文件中可以有多个表达式)并转换为等价的后缀表达式后输出到屏幕上。2、表达式中的运算量可以是任意整数或者小数,支持加、减、乘、除、取负运算以及小括号,表达式中的空格、制表符等空白符号可以被忽略。2. 后缀表达式的计算 - 2 -

毕业作品网站 391

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

实现中缀表达式转后缀表达式(java)

实现中缀表达式转后缀表达式 中缀表达式转后缀表达式的思路步骤分析: 1.初始化两个栈:运算符栈s1和存储中间结果的栈s2; 2.从左至右扫描中缀表达式; 3.如果遇到操作数时,将其压入s2; 4.如果运算符时,比较其与s1栈顶运算符的优先级;  (1)如果s1为空,或栈顶运算符为左括号“(”,则直接入栈;  (2)否则,若优先级比栈顶运算符高,也将运算符压入s1;  (3)否则,将s1栈顶运算符弹出并压入s2中,再转到4-(1)与s1中新的栈顶运算符相比较; 5.遇到括号时:  (1)如果是左括号“(”,则

xiaowanziddd的博客 2354

java后缀表达式_Java中缀表达式转后缀表达式实现方法详解

本文实例讲述了Java中缀表达式转后缀表达式实现方法。分享给大家供大家参考,具体如下:本文先给出思路与方法,最后将给出完整代码项目实战:算法综述:一、中缀表达式转后缀表达式:1.中缀表达式要转后缀表达式,首先需要两个Stack(栈),其中一个应用于存放字符,另一个用于存放数字。2.读到数字直接存入数字栈中,读到字符时,要咸鱼栈内前一元素(字符)进行比较,当当前(要存入的字符)优先级大于迁移字符时才...

weixin_36068796的博客 647

Java实现:中缀表达式转后缀表达式

使用Java实现中缀表达式转后缀表达式。

猫晨的技术小屋 747

java后缀是转中缀表达式过程_java实现中缀表达式转后缀表达式

public class StackTest {public static void main(String[] args){String s = "5+4*6/2+3+(4*5)/5";//546*2/+3+45*5/+// String s = "2*(9+6/3-5)+4";//2963/+5-*4+System.out.println(convert(s));}/*** 等级很重...

weixin_29625619的博客 306

java实现中缀表达式转后缀表达式

package com.bigdata.datastructure.stack; import java.util.ArrayList; import java.util.List; import java.util.Stack; /** * @ description: 中缀表达式转后缀表达式,并计算值 * @ author: spencer * @ date: 2020/10/30 9:21 */ public class Calculator2 { public static v

weixin_43861104的博客 454

JAVA-算法-中缀表达式转后缀表达式的案例

1.遇到数字直接拼成字符串2.遇到+ - * / 先判断优先级优先级高于栈顶的则入栈否则将栈中现有的更高级或同级级运算符进行出栈并拼接3.遇到括号时如果是左括号 ‘(’ 直接放入栈中作为优先级最低的如果是右括号 ‘)’,则将栈中的所有元素出栈拼接,直到左括号为止,保证括号内的先运算4.遍历完成后,将栈中剩余的出栈拼接

Java_XiaoBei的博客 192

Java数据结构之中缀表达式转后缀表达式

简介 通过数组模拟栈进行中缀表达式转后缀表达式,再进行计算 不说废话,请看代码。 package com.atguigu.Stack; import java.util.ArrayList; import java.util.List; import java.util.Stack; /** * @auther: 桦 * @description: 将中缀表达式转为后缀表达式 */ public class TransformationTest { public static void m

weixin_51340877的博客 219

Java中缀表达式转后缀表达式

中缀表达式转后缀表达式 1. 概述 初始化两个栈:运算符栈s1和存储中间结果的栈s2 从左向有扫描中缀表达式 遇到操作数时将其压入s2 遇到运算符时,比较其与s1栈顶运算符的优先级: 如果s1为空,或栈顶元素为’(’,则将此运算符入栈 否则,若优先级比栈顶运算符的优先级高,则将运算符压入s1栈 否则,将s1栈顶的运算符弹出并压入到s2中,再次转到1,与新的栈顶元素进行比较 遇到括号时: ...

!不将就的博客 268

用Java实现中缀表达式转后缀表达式

中缀表达式转后缀表达式 后缀表达式 后缀表达式又称逆波兰表达式,明显的特点是:逆波兰表达式中没有括号,计算时将操作符之前的第一个数作为右操作数,第二个数作为左操作数,进行计算,得到的值继续放入逆波兰表达式中。 但日常生活中我们总是习惯于写中缀表达式,所以需要先将中缀表达式转为后缀表达式。 规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。 简单图解后缀表达式 opStack用于存储操作符,suffixList用于存

m0_51119239的博客 2799

java语言中缀表达式转后缀表达式

仅用于 + - * / ( ) 的中缀表达式 思路: 因为在输入表达式的时候,表达式是字符串。为例遍历字符串方便,可以考虑将其转化成为ArrayList类型的。由于表达式中可能会出现多位数的情况(比如20*3,遍历的时候先遍历2再遍历0,但是20才是一个数),所以定义一个变量numString用来拼接数字。所以代码如下: public static List<String> infix...

Willow_zhu的博客 491

java实现中缀表达式转后缀表达式并且计算

自己写一个栈 用数组实现package cn.itcast.StackAndQuen; import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * Created by likailong on 2016/10/16. * 中缀表达式到后缀表达式 */ public class Ma

李凯龙 3601
上一篇: 堆排序java实现
下一篇: 五点共圆证明方法
ling913
博客等级 码龄15年 115粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值