中序表达式变成后序表达式 JAVA实现版本

Java-Stack实现中序表达式求值 中序表达式:对人而言是很直观的(我们平时计算时接触最多的表达式),但计算机处理起来比较麻烦(括号、优先级之类的),前序和后序表达式中没有括号,而且在计算中只需单向扫描,不需要考虑运算符的优先级。如2+3*4+5 前序表达式:又称为前缀表达式,不含括号的算术表达式,而且它是将运算符写在前面,操作数写在后面的表达式,例如:"+ 2 + * 3 4  5",也称为“波兰式”。它运算时需要注 阅读详情
package algorithm;

import java.util.*;

public class ConvertMiddleOrder2PostOrder {
	   /*
	    * 
	    * convert middleOrder math expression to PostOrde
	    * for example: A-B*(C+D)/E (in-order)
	    * converted result: ABCD*E/- (post-oder)
	    */
	
	   public static String ConvertInOrder2PostOrderUtil(String inOrderString){
	
		    //support:  + - * / 
		    /* element content:
		     * l = <
		     * g = >
		     * e = =
		     * n = not available 
		     * each operation map to array index: 
		     * + =   0
		     * - =   1
		     * * =   2
		     * / =   3
		     * for example: oprPriority[2][3]=‘e',  就是 operator * 跟栈类的  /比较优先级,结果是优先级 相等。
		     * (, ),比较特殊,就在代码中处理了。
		     */
		   
	     char [][] oprPriority = new char[][]{
	    	 {'e','e','l','l'},
	    	 {'e','e','l','l'},
	    	 {'g','g','e','e'},
	    	 {'g','g','e','e'}
	    	 }; 
		
	    if(inOrderString.length()<3) {
	    	System.out.println("bad expression data");
	    	return null;
	    }
	    	
	    char[] resultarray = new char[inOrderString.length()];
	    int rstindex=0;
	    int len=inOrderString.length();
	    int curposition=0;
	    
	    //save operators
	    Stack<String> mystack = new Stack<String>();
	    char[] tmparray = new char[2];
	    char stackchar,curchar;
	    while(len>0){
	    	System.out.println("converted str="+new String(resultarray));
	    	curchar=inOrderString.charAt(curposition);
	    	switch(curchar) {
	    	case '0':
	    	case '1':
	    	case '2':
	    	case '3':
	    	case '4':
	    	case '5':
	    	case '6':
	    	case '7':
	    	case '8':
	    	case '9':
	    		resultarray[rstindex++]=curchar;
	    		curposition++;
	    		len--;
	    		break;
	    	case '+':
	    	case '-':
	    	case '*':
	    	case '/':
	    		if(!mystack.empty()){
	    		   //compare operation
	    			tmparray=mystack.peek().toCharArray();
	    		    if(tmparray[0]=='(') {
	    		    	//push this operator as '(' in stack is lowest
		    			tmparray[0]=curchar;
		    			mystack.push(new String(tmparray));
		    			curposition++;
		    			len--;
	    		    } else {
	    		     int column,row;
	    		     switch(curchar){
	    		        case '+':
	    		        	row=0;
	    		        	break;
	    		    	case '-':
	    		    		row=1;
	    		        	break;
	    		    	case '*':
	    		    		row=2;
	    		        	break;
	    		    	case '/':
	    		    		row=3;
	    		        	break;
	    		        default:
	    		        	System.out.println("expression error");
	    		    		return null;
	    		     }
	    		     switch(tmparray[0]){
	    		        case '+':
	    		        	column=0;
	    		        	break;
	    		    	case '-':
	    		    		column=1;
	    		        	break;
	    		    	case '*':
	    		    		column=2;
	    		        	break;
	    		    	case '/':
	    		    		column=3;
	    		        	break;
	    		        default:
	    		        	System.out.println("expression error");
	    		    		return null;
	    		     }
	    		     
	    		    char result=oprPriority[row][column];	
	    		    switch(result){
	    		     case 'g': // incoming > operator in stack
	    		    	    //push this operator if it is higher than stack top
			    			tmparray[0]=curchar;
			    			mystack.push(new String(tmparray));
			    			curposition++;
			    			len--;
			    			break;
	    		     case 'e': //=
	    		     case 'l': // <
	    		    	    //pop up the top operator in stack
	    		    	    mystack.pop();
	    		    	    resultarray[rstindex++]=tmparray[0];
	    		    		break;
	    		     default:
	    		        	System.out.println("expression error");
	    		    		return null;
	    		     }
	    		   }
	    		    
	    		} else {
	    			//push this operator
	    			tmparray[0]=curchar;
	    			mystack.push(new String(tmparray));
		    		curposition++;
		    		len--;
	    		}
	    		
	    		break;
	    		
	    	case '(':
	    		//push into stack
	    		tmparray[0]=curchar;
    			mystack.push(new String(tmparray));
	    		curposition++;
	    		len--;
	    		break;
	    		
	    	case ')':
	    		//pop up all operator until it meet '('
	    		while(!mystack.empty()){
	    			tmparray=mystack.peek().toCharArray();
	    			mystack.pop();
	    			if(tmparray[0]=='('){
	    				break;
	    			} else {
	    			  //save this operator to result str
	    			  resultarray[rstindex++]=tmparray[0];	
	    			}
	    		}
	    		curposition++;
	    		len--;
	    		
	    		break;
	    	default:
	    		System.out.println("expression error");
	    		return null;
	    	}	    	
	    }
	    
	    while(!mystack.empty()) {
	    	tmparray=mystack.pop().toCharArray();
	    	resultarray[rstindex++]=tmparray[0];
	    	System.out.println("converted str="+new String(resultarray));
	    }
		String result=new String(resultarray);
		return result;	
	}
}


测试语句:


ConvertMiddleOrder2PostOrder.ConvertInOrder2PostOrderUtil("1-2*(3+4)/5"))


//output is 

converted post-order expression is: 1234+*5/-


Windows 10/11 安装 HYSPLIT 气象模型全攻略(附必备工具包下载清单) 本文提供了一份详尽的Windows 10/11系统下HYSPLIT气象模型安装与配置全攻略。指南涵盖了从核心认知、必备工具包(Tcl/Tk、ImageMagick)下载,到分步安装、环境变量设置及首次运行验证的完整流程,旨在帮助研究者和学生高效部署这一用于大气轨迹模拟与污染物扩散分析的专业工具。 阅读详情

相关推荐

奇迹MU单机版开服全流程:从零搭建到分辨率调整(附GM工具使用技巧)

本文详细介绍了奇迹MU单机版从零搭建到分辨率调整的完整流程,包括环境配置、服务端启动、GM工具使用技巧等关键步骤。特别针对现代高分辨率显示器提供了优化方案,帮助玩家轻松搭建个性化游戏环境,重温经典MMORPG的独特魅力。

b3n4m5q6w7的博客 677

中序表达式转后序

中序表达式转后序表达式的方法 遍历表达式,数字入后序表达式栈; “(”入符号栈 遇到 “)”;则符号栈不断弹出运算符,直到弹出 “)” 遇到运算符,则与符号栈栈顶运算符比较优先级,若栈顶优先级较大,则将栈顶运算符弹出并推入后序栈;否则直接推入符号栈 后序栈弹出并反转即为后序表达式 //方便起见,将后序栈改为后序队列 import java.util.LinkedList; import jav...

qq_40622253的博客 1469

NRF52832串口通信避坑指南:从SDK配置到硬件流控(RTS/CTS)实战

本文详细介绍了NRF52832串口通信的实战指南,从SDK配置到硬件流控(RTS/CTS)的完整实现。通过分析UARTE模块特性、解决SDK版本差异问题、正确配置硬件引脚以及实现稳定通信的代码示例,帮助开发者避开常见陷阱,确保高效可靠的串口通信。特别强调了硬件流控在高速通信中的重要性及其实践方法。

weixin_33739646的博客 280

中序表达式转为后序表达式

中序表达式计算以及中序表达式转为后序表达式。

ikun的博仔的博客 1857

番茄(西红柿)叶片病害检测数据集:12k+图像,10类,yolo标注

本文介绍了包含12,250张图像的番茄叶片病害检测数据集,涵盖10种常见病害类型及健康叶片,采用YOLO格式标注。数据集具有三大核心价值:科研层面填补病害样本空白,推动算法创新;产业应用支持精准诊断、早期预警,降低损失20-40%;社会生态方面减少农药使用15-30%,助力绿色农业。该数据集作为AI与农业结合的数字基础设施,适用于计算机视觉项目、科研实验等场景。

m0_73878864的博客 1131

银河麒麟服务器操作系统V10 SP1:跨架构激活与设备更换无忧指南

本文详细解析了银河麒麟服务器操作系统V10 SP1的跨架构激活新特性。该特性彻底解除了授权与CPU架构的绑定,允许同一份授权在x86、ARM、龙芯等不同架构服务器间灵活使用。文章提供了从新设备激活到硬件更换后保持激活状态的全流程实战指南,并分享了内网环境部署等高级技巧,助力企业简化运维、提升硬件资源管理灵活性。

ff678的博客 347

中序表达式转后序表达式

中序表达式是平常我们经常见到的数学表达式。但是中序表达式不便于计算机计算,常常需要将中序表达式转成后序表达式或者前序表达式。 中序表达式转后序表达式的算法过程: 1、若输入是左括号时,将输入入栈。 2、若输入是右括号时: 2.1:首先判断判断栈是否为空,若为空则给出错误提示信息,并结束程序。 2.2:栈非空,则循环出栈,直至第一个左括号出现,循环结束。 3、若输...

qq_36766474的博客 2275

PCIe协议之 Equalization篇 之 谈谈几种模式

对于两端有能力最高支持 32 GT/s 及以上速率的设备,如果把目标速度设置为 8 GT/s 或 16 GT/s 速率,是不建议采用 Bypass-Equalization-to-Highest-Rate 模式的,即便采用了,也不会针对 8 GT/s 或 16 GT/s 的目标速率进行 EQ。对于支持 32 GT/s 及以上速率的设备,其可能根本无需工作在 8 GT/s 或 16 GT/s 速率,这时再针对 8 GT/s 或 16 GT/s 速率进行 EQ,多少有点浪费。

那么菜的博客 561

中序转为前序与后序

一.中序—&gt;前序 1.步骤: (1)从右到左读进中序表达式的每个字符 (2)如果读进的字符为操作数,则直接输出到前序表达式中 (3)如果遇到“(”,则弹出堆栈内的运算符,直到弹出一个“)”,两者相互抵消 (4)“)”的优先级在堆栈内比任何运算符都小,不过在堆栈外却是优先级最高者 (5)当运算符准备进入堆栈内时,必须和栈顶运算符比较,如果外面的运算符优先级高于或等于栈顶运算符,则压...

T-dreaming博客 2480

AI智能体面试实战与真题解析: 312+道面试题完整答案 (下篇)

本文覆盖220道基础八股文+92道项目面试题,涵盖Agent架构、RAG、工具调用、记忆系统、多智能体、大模型基础、工程化实践、Prompt工程9大模块,含完整代码实现和模拟面试剧本。

program哲学 296

YOLOv8改进 | 卷积模块 | 用DWConv卷积替换Conv【轻量化网络】

YOLOv8改进,yolov8,yolov8创新,yolov8涨点

kay_545 7155

前序表达式 中序表达式 后序表达式

中序表达式: 中序表达式就是我们日常使用的表达式,由左往右阅读,结构清晰,但需要括号改变优先级,对计算机不友好 eg: (1+4)*3+10/5 前序表达式(波兰表示法Polish notation,或波兰记法): 一种逻辑、算术和代数表示方法,其特点是操作符置于操作数的前面,如果操作符的元数(arity)是固定的,则语法上不需要括号仍然能被无歧义地解析,不需要括号来改变优先级,未推广使用...

细雪扶风 8959

中台战略-第五章、中台建设方法论

文章目录第五章、中台建设方法论5.1 中台架构整体策略5.2 业务顶层设计5.3 业务中台设计方法论5.3.1 能力支撑是基础5.3.2 中心自治是承载形式5.3.3 3层模型是骨架5.3.4 5步法是指导思想1. 业务抽象2. 高阶设计3. 组件建模4. 开发交付5. 持续运营5.4 数据中台设计方法论5.4.1 总体规划5.4.2 数据集成5.4.3 模型建设5.4.4 通用研发5.4.5 资产管理5.4.6 数据服务5.5 应用向中台迁移的3中途径和方法5.5.1 方法1:新应用替换旧应用5.5.2

沧海之巅的专栏 1459

后序表达式转化为中序表达式

一.后序表达式转化为中序表达式 后序表达式 2 3 * 2 1 - / 3 4 1 - * +   中序表达式 ( ( ( 2 * 3 ) / ( 2 - 1 ) ) + ( 3 * ( 4 - 1 ) ) ) 我们在学习数据结构的时候就知道需要用到栈 通过观察不难发现我们在后序表达式中每次遇到“+”,“-”,“*”,“/”时都要处理对应的前2个数,例如2 3 * 处理为( 2 * 3 ...

qq_37663299的博客 2188

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

中序表达式转后序表达式的java实现

//将一个中序表达式转换为后序表达式 public class InfixToPostfix { public static int compare(String s1, String s2) { if((s1.equals("+")||s1.equals("-"))&&(s2.equals("*")||s2.equals("/"))) return -1; else

roubaoc的博客 950

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

算术表达式的计算:中序表达式转后序表达式

算术表达式的计算:中序表达式转后序表达式中序表达式转后序表达式的目的中序表达式转后序表达式后序表达式的计算 中序表达式转后序表达式的目的 在我们的日常数学表达中使用的诸如2*(5-1) 这样的表达式是中序表达式,我们使用数学计算规则对表达式进行计算,但是计算机要计算算术表达式,如果直接使用计算规则(括号-乘除-加减)这样的顺序计算的话就要去使用if-else语句判断括号、加减乘除然后计算,如果一个...

SGT的博客 6111

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

中序表达式 转为 后序表达式(包含了输出运行的结果)(1310 P102)

中序表达式:我们直观看到的表达式。 中序表达式转前序表达式:就是从右向左历遍表达式,操作数在前,操作符在后的一种形式。 中序表达式转后序表达式:就是从左致右的历遍表达式,操作数在前,操作符在后的一种形式。 参考博客: http://blog.youkuaiyun.com/zhufenghao/article/details/48863163 http://www.jiansh

hacker_crazy的专栏 762

Java将算术表达式由中序表达式转化为后序表达式

如题,使用Java将中序表达式转化为后序表达式 import java.util.Scanner; import java.util.Stack; public class Q100310 { private static void infixToPostfix(String exp) { String[] params=exp.split(" "); Stack<Strin...

qq_16118409的博客 526

中序变后序Java_中序表达式转后序表达式的java实现

//将一个中序表达式转换为后序表达式public class InfixToPostfix {public static int compare(String s1, String s2){if((s1.equals("+")||s1.equals("-"))&&(s2.equals("*")||s2.equals("/")))return -1;else if((s1.equal...

weixin_34312149的博客 321

Java 未省略括号的中序表达式转后序表达式

Java 未省略括号的中序表达式转后序表达式 思路: 用一个栈暂存操作符,一个空白字符串str在读取中序的过程中拼接成后序表达式 顺序读取中序表达式 遇到左括号,不执行任何操作 遇到操作数,拼接在str之后 遇到右括号,从栈中弹出一个操作符拼接在str之后 实现: public static String infixToPostfix() { Stack<String> stack = new Stack<>(); String tmp = ""; Sca

realzhangsan的博客 276

Java栈实现括号匹配、中序转后序表达式、中序表达式直接计算

数据结构复习,代码是最好的说明。 栈可以用数组实现,也可以用单链表实现,毕竟简单,基本操作自查API。 括号匹配: public class ParenthesisMatching { private static HashMap map; static { map = new HashMap(); map.put(')','(');

poyuan97的博客 919

用Java实现的后序表达式计算类,支持科学计算

用Java实现支持科学计算的数学公式运算类 通过对现有的后序表达式计算方法,经过稍许改动实现支持科学计算 废话不多说,直接上代码 计算类代码如下: import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; import java.util.Stack; public class Expre...

weixin_43481439的博客 571

栈及相关几个应用(进制转换,括号匹配,中序表达式变后序表达式)

package com.java.ly2011.July;/** * 栈及 进制转换 、括号匹配、中序表达式变后序表达式 * @author Acer * */public class SomeStackRelated { public static void

383

Java实现中序表达式转换成后序表达式+后序表达式求值实现

后序表达式的概念:又称后缀表达式,不含括号的表达式,他的运算符写在前面,操作数写在后面,也没有算术优先级问题,又称“逆波兰式” 优点:计算机从左到右扫描,不需要考虑算术优先级问题 PS:原创,如有错误,请指出,感谢指教! (一)、中序表达式转后序表达式 步骤:  1、先将中序表达式转换成字符数组  2、依次取得字符数组的每一个元素,直至取完     若该元素为数字,则...

weixin_30344995的博客 604

java 中序表达式_Java实现中序表达式的实例代码

什么是中序表达式前序(前缀)表达式要求每一个操作符出现在其操作数之前.一般不用. 写表达式的后序表达式一般是为了便利于计算机编程中栈的实现,所以用的较多.具体代码如下所示:package 表达式求值;import java.util.Stack;/** 中序表达式求值实现*/public class CenterExpression {public double evaluate(String e...

weixin_39968760的博客 175
上一篇: 什么叫线程安全
下一篇: 使用Thrift0.9.1实现跨语言调用Golang、Php、Python、Java
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值