java中栈的应用-带括号的算术表达式

java使用栈解析算术表达式 系列文章目录 1. java使用栈翻转字符串 2. java使用栈解析分隔符匹配 文章目录系列文章目录前言一、后缀表达法二、把中缀表达式转换成后缀表达式1. 人类是如何计算中缀表达式的值2.如何将中缀表达式转换成后缀表达式三、转换规则1. 中缀表达式转成后缀表达式的java代码2. 后缀表达式求值过程3. 后缀表达式的求值规则4. 后缀表达式求值的java代码总结 前言 前面两篇文章分析了栈的基本使用,最后我们使用栈来解析算术表达式。如 4+6,或者5*(2+3),或者((2+4)7)+3*(8-4) 阅读详情

问题分析:

表达式有中缀表达式,后缀表达式和前缀表达式;

其中中缀表达式就是我们平常写的算术表达式,而后缀表达式就是将运算符放在两个操作数之后,前缀则放在之前;

例如:中缀表达式:A+(B-C/D)*E  对应的后缀表达式就是 ABCD/-E*+,前缀类比

由于后缀表达式中无运算优先级又无括号的约束问题,因此计算一个后缀表达式比计算一个中缀表达式咬简单



1将原算术表达式转换成后缀表达式


要使运算符出现的次序与真正的算术顺序一致,就要使优先数高的以及括号内的运算符先出现在前,所以需要一个栈来保留未被送到后缀表达式的运算符


算法思路如下:

(1)初始化一个运算符栈

(2)从算术表达式输入的字符串中从左到右读取一个字符

(3)若字符使操作数,则直接送往后缀表达式

(4)若当前字符是左括号,则压进栈内

(5)若当前字符为运算符,则进行下面操作:

      (5.1)当运算符为空时,则将其压入栈中

      (5.2)当此运算符优先级高于栈顶字符,则将其压入栈中;否则,去出栈中字符送到后缀表达式,并将当前运算符压栈

(6)若当前字符为右括号,则反复将栈顶弹出送往后缀表达式,直到栈顶为左括号为止,再将左括号丢弃

(7)若读取还未完毕,则转到步骤2

(8)若读取结束,则将栈中的运算符弹出并送往后缀表达式










2计算后缀表达式


问题分析:

要计算后缀表达式的值比较简单,只要先找到运算符,在去找之前最后两个操作数;

利用一个栈来保留后缀表达式中还未参加运算的操作数,称为操作数栈



算法分析如下:

1.初始化一个操作数栈


2从左到右依次读入后缀表达式的字符


 (1)若当前为操作数,则将操作数压入栈中


 (2)若当前为运算符,则从栈顶弹出两个操作数参与运算,并将运算结果压入操作栈中


3重复步骤2直到后缀表达式为空为止,则操作栈中的栈顶元素即为后缀表达式的计算结果

import java.util.Stack;

public class Example3_3 {
	//将算术表达式转换为后缀表达式的函数,结果一字符串的形式返回
	public String converToPostfix(String expression)throws Exception{
		Stack<Character> st=new Stack<>();   //初始化一个运算符栈
		String postfix=new String();   //用于储存后缀表达式
		for(int i=0;expression!=null&&i<expression.length();i++){
			char c=expression.charAt(i);
			if(' '!=c){
				//为左括号
				if(isOpenParent(c)){
					st.push(c);
				}//为右括号
				else if(isCloseParent(c)){
					char ac=st.pop();
					while(!isOpenParent(ac)){
						postfix=postfix.concat(String.valueOf(ac));
						ac=st.pop();
					}
				}//为运算符
				else  if(isOperator(c)){
					//运算栈非空,取出栈顶优先级高的运算符送完后缀表达式
					if(!st.empty()){
						char ac=st.pop();
						//栈取出的字符优先级比c高
						while(!st.isEmpty()&&priority(ac)>=priority(c)){
							postfix=postfix.concat(String.valueOf(ac));
							ac=st.pop();
						}//栈取出的字符优先级比c低,则将取出的字符重新入栈
						if(ac!=' '){
							st.push(ac);
						}
					}st.push(c);    //将c入栈
				}//为操作数,直接串联到postfix内
				else {
					postfix=postfix.concat(String.valueOf(c));
				}
			}
		}//当表达式读完就将算术栈pop出加入postfix
		while(!st.isEmpty()){
			postfix=postfix.concat(String.valueOf(st.pop()));
			
		}
		return postfix;
	}
	//对后缀表达式进行运算的函数
	public double numberCalculate(String postfix)throws Exception{
		Stack st=new Stack<>();//创建一个操作数栈
		for(int i=0;postfix!=null&&i<postfix.length();i++){
			char c=postfix.charAt(i);
			//如果为运算符
			if(isOperator(c)&&!st.isEmpty()){
				double d2=Double.valueOf(st.pop().toString());
				double d1=Double.valueOf(st.pop().toString());
				double d3=0;
				if('+'==c){
					d3=d1+d2;
				}
				if('-'==c){
					d3=d1-d2;
				}
				if('/'==c){
					d3=d1/d2;
				}
				if('*'==c){
					d3=d1*d2;
				}
				if('%'==c){
					d3=d1%d2;
				}
				if('^'==c){
					d3=Math.pow(d1, d2);
				}
				//将运算结果压入操作数栈中
				st.push(d3);
			}else{//为操作数时直接压入操作数栈
			st.push(c);}
		}
		return (double) st.pop();//返回运算结果
	}
	//判断字符为运算符
	public boolean isOperator(char c){
		if('+'==c||'-'==c||'/'==c||'*'==c||'%'==c||'^'==c){
			return true;
		}
		else {
			return false;
		}
	}
	//判断字符为左括号
	public boolean isOpenParent(char c){
		return c=='(';
	}
	//判断字符为右括号
	public boolean isCloseParent(char c){
		return c==')';
	}
	//判断算法的优先级
	public int priority(char c){
		if(c=='^'){
			return 3;
		}
		if(c=='/'||c=='*'||c=='%'){
			return 2;
		}
		else if(c=='-'||c=='+'){
			return 1;
		}
		else return 0;
	}
	
	

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Example3_3 p=new Example3_3();
		String postfix =p.converToPostfix("3+2*8+(5+5)+2^2/2*5%3");
		System.out.println("表达式结果为:"+p.numberCalculate(postfix));

	}

}
运算结果
表达式结果为:30.0

利用栈解析算术表达式 在编写编译器时经常需要实现对算术表达式的解析,然而对于计算机的算法来说如果直接求解算术表达式的值,还是相当困难的。因此解析算术表达式经常分步实现: 将中缀的算术表达式转换为后缀表达式 计算后缀表达式的值 在正式介绍算法的实现之前,先介绍一点有关表达式的基础知识基础知识1. 后缀表达式日常算术表达式是将操作符(operator)(+,-,*,/)放在两个操作数(operands)(数字,或者代表数字的 阅读详情

相关推荐

用java实现一个带括号的计算器(无界面)

import java.io.*; import java.util.Stack; public class test { public static boolean NotOperator(char c) { //用于判断字符c是运算符还是操作数 return switch (c) { case '#', '+', '-', '*', '/', '(', ')' -> false; default -> true; .

weixin_41243677的博客 752

Java用栈实现带括号的四则运算表达式计算

实现分析 栈是我们计算机中的一种数据结构,它有着先进后出的数据特性。四则运算表达式实现的方式有多种,我们先用栈的数据结构来实现这个算法,在Java中是没有直接的栈结构的,所以要实现此算法,我们的工作有两步: 用Java常见的数据类型设计stack类,并根据算法实现的需求设计合理的工具方法 理清实现思路用代码表述出来 在这里我们的栈用数据来模拟实现,因为我们是用数组模拟实现的所以我们栈的大小一定是固定的,在我们存取数据的时候应该判断当前栈是否已经满了或是是否里面没有数据以避免数组访问越界,我们对数据的存

任天柳 3217

Java实现的带括号多则运算计算器

在Java中,每个源代码文件通常包含一个公共类,并且文件名与公共类名相同。类可以包含多个方法,这些方法定义了类的行为。以下是一个简单的类和方法定义的例子:");在这个例子中,HelloWorld类包含一个main方法,它是Java应用程序的入口点。public关键字表示该类和方法对其他类可见。Java编译器(javac)负责将源代码文件(.java)转换成字节码文件(.class)。以下是编译一个简单的Java类的基本命令:这个命令执行后,会在同一目录下生成一个名为。

weixin_30533301的博客 1039

Java数据结构(7)----栈实现综合计算器(带多重括号)

栈实现综合计算器(带多重括号) 前言 今天学习了栈如何实现综合计算器,现在我们来总结一下,再自己画画图深入理解一下,再实现一下没有实现的功能,如何运算带多重括号的运算表达式 比如这个 (((1623(25-5))+1-5)*3-4)/2 表达这个。 思路: 通过一一个index值(索引),来遍历我们的运算表达式 如果我们发现是一个数字,就直接入数栈, 发现是符号就进符号栈 如果发现当前的符号栈为...

qq_44752800的博客 1862

java字符串数学表达式(含括号)计算值

代码均为自己设计所写,分享一下。 字符串数学表达式(含括号)计算值 如: "31+3*3-20/2*5+40/8+4*5" ((2*(19-13*(1+2)/39)/6+4)-5)/5+((2+3)*2-5)

表达式求值(带括号的四则运算)

使用STL和求值算法,编写的求一个长串表达式的值,包括了+-/*以及带括号的运算的混合运算,只要调用它就可以方便的求出结果了,也可以放在自己的程序里! 例如:char *express = "5+37/5+(38-2)/2-10+(3+2)/(10-7)*(16-5)-3"; printf("%s\n",CExpress::GetExpressVal(express,strlen(express)).c_str());

表达式计算 (栈处理带括号的表达式)

问题描述   输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。 输入格式   输入一行,包含一个表达式。 输出格式   输出这个表达式的值。 样例输入 1-2+3*(4-5) 样例输出 -4 数据规模和约定   表达式长度不超过100,表达式运算合法且运算过程都在int内进行。 代码如下: #include&lt;bits/stdc++.h...

自渡的博客 2044

算术表达式求值完整课程设计报告-对于基本的算术表达式,以字符序列的形式从终端进行输入,要求语法正确的,不含变量,按照算术运算优先级顺序,实现基本算术表达式的运算过程。

对于基本的算术表达式,以字符序列的形式从终端进行输入,要求语法正确的,不含变量,按照算术运算优先级顺序,实现基本算术表达式的运算过程。 (1) 输入:输入一个算术表达式,以#结束 (2) 输出:输出数据栈栈顶元素和最后表达式的运算结果 (3) 程序功能:完成包含加、减、乘、除运算,包含括号的基本整数表达式的运算,可实现动态的输入,实时的输出。 (4) 测试数据:3*(7-2)和自选数据

数据结构与算法——栈的应用括号匹配

括号匹配问题是对于栈的应用,那么如何利用栈解决括号匹配的问题呢?

Cruies_95633的博客 5117

带括号的算术表达式计算程序

采用算符优先数算法,能正确求出求值表达式

带括号的算术表达式运算

带有()的加减乘除运算,通过对运算符赋予优先级,词法分析,语法分析,及栈实现了运算

栈的应用——括号匹配、表达式求值、递归

本文主要介绍了栈在括号匹配、表达式求值和递归方面的应用,包含理论知识和代码。

HePingxxb的博客 1851

【GD32篇】驱动AD7616完成数据采集

GD32F10X驱动AD7616完成数据采集

we_long的博客 1万+

括号表达式 java_java中栈的应用-带括号的算术表达式

问题分析:表达式有中缀表达式,后缀表达式和前缀表达式;其中中缀表达式就是我们平常写的算术表达式,而后缀表达式就是将运算符放在两个操作数之后,前缀则放在之前;例如:中缀表达式:A+(B-C/D)*E 对应的后缀表达式就是 ABCD/-E*+,前缀类比由于后缀表达式中无运算优先级又无括号的约束问题,因此计算一个后缀表达式比计算一个中缀表达式咬简单1将原算术表达式转换成后缀表达式要使运算符出现的次序与...

weixin_39811101的博客 304

DC竞赛 国能日新功率预测题 rank21 解决方案(适合新手)

DataCastle国能日新光伏功率预测 数据异常处 本题在测试集中提供了时间、辐照度、风速、风向、温度、压强、湿度、实发辐照度8个特征,以及标签**实际功率**。 而在训练集中只有前七个特征,无实发辐照度。 策略 在观察了数据之后,我们确定实发辐照度是一个强力特征,于是我们采取了stacking的策略: 1. 第一次训练以实发辐照度为标签,预测 测试集的实发辐照度 2....

yyhhlancelot的博客 7294

LVGL开发新选择:深度对比NXP GUI Guider与SquareLine Studio,免费版够用吗?

本文深度对比了LVGL开发中两款主流工具NXP GUI Guider与SquareLine Studio的核心差异,包括功能定位、设计能力、代码生成质量和硬件适配等方面。针对不同项目需求,分析了免费版工具的适用性,帮助开发者根据预算和功能需求做出明智选择。特别关注了GUI设计工具在嵌入式开发中的实际应用效果。

weixin_26976635的博客 429

栈练习之Example001-判断一个算术表达式中的括号是否正确配对

C 语言中算术表达式中的括号只有小括号。编写算法,判断一个表达式中的括号是否正确配对,表达式已经存入字符数组 `exp[]` 中,表达式的字符个数为 `n`。

二木成林 8966

告别降级CUDA!手把手教你为RTX 50系显卡(5080/5090)配置专属的PyTorch Nightly + vLLM推理环境

本文详细指导如何为RTX 50系显卡(5080/5090)配置专属的PyTorch Nightly和vLLM推理环境,特别针对CUDA 12.8的适配问题提供解决方案。从硬件准备到源码编译,再到模型部署与性能调优,手把手教你构建高效AI推理系统。

weixin_33724046的博客 409

数据结构Java实现——①栈-->栈的应用三、算术表达式求值

当一个算术表达式中含有多个运算符,且运算符的优先级不同的情况下,如何才能处理一个算术表达式????? 2、思路 首先我们要知道表达式分为三类: ①中缀表达式:a+(b-c/d)*e ②前缀表达式+a*-b/cde ③后缀表达式abcd/-e*+ 由于运算符有优先级,所以在计算机中计算一个中缀的表达式非常困难,特别是带括号的更麻烦,而后缀表达式中既无运算符优先又无括号的约束问题因为在后缀表达式中运算符出现的顺序正是计算的顺序,所以计算一个后缀的表达式更简单。 所以,可以将求算术表达式的值的过程化

Stone6762的专栏 5909

Oracle EBS 帐套(Ledger/SOB)如何定义会计主体、如何支撑多准则 / 多报告、组织与帐套的绑定关系、以及项目落地时的设计差异。下面从实现逻辑、核心要素、组织模型、多账簿、科目设计、项

本文对比了Oracle EBS R12与SAP S/4HANA在帐套(Ledger)设计上的核心差异。Oracle采用4C架构(科目/币种/日历/准则),帐套作为独立会计主体,主辅账物理隔离;SAP则以公司代码为主体,通过平行分类账在同一凭证中实现多准则核算。关键差异体现在:Oracle强调边界隔离,适合差异大的集团;SAP注重统一视图,适合实时合并需求。实施时需注意:Oracle避免过度建账套,SAP需统筹科目与维度设计。两者分别体现了"盒子"与"滤镜"的设计哲学。

金牌架构师 417

[Dify] -进阶13- 使用“知识库 + 工作流”打造智能推荐系统

本文介绍了在Dify平台上构建智能推荐系统的方法,重点阐述了知识库与工作流技术的结合应用。通过知识库管理RAG流程,实现文档上传、向量嵌入和检索优化;利用工作流设计节点化推荐逻辑,支持并行处理与条件分支。以电话销售话术推荐为例,展示了从数据收集到实时生成的完整流程。该方法具有准确性高、扩展性强、维护简便等优势,可广泛应用于各类推荐场景,实现从数据存储到智能推荐的闭环解决方案。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 1067

利用栈实现算术表达式求值(Java语言描述)

算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识。声明:部分代码参考自茫茫大海的专栏。 链栈的实现: package 算数表达式求值;      public class Stack {       //节点类       public class Node{           public T data;     

刘默默的博客 5087

什么是 SAP S/4HANA 的 Brown Field 迁移和 Green Field 迁移

Brown Field实施涉及升级现有的 SAP 环境并继续使用一些遗留组件。它类似于传统升级,因为它涉及软件更新、一些数据转换和一些业务流程的调整。它仍然具有破坏性,但比Green Field实施要少得多。如果你是风险厌恶者,倾向于逐步使用 S/4HANA 的功能,或担心 S/4HANA Green Field方法的成本,那么你可能更喜欢这种方法。混合方法结合了Brown Field和Green Field迁移的一些元素。它从公司的 SAP 系统的副本开始,包括配置设置和定制。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1324

【数据结构】如何使用栈来判定括号是否匹配

题目: 先定义堆栈的几个基本操作,再设计一主函数利用堆栈的操作完成以下功能:假设一个算术表达式中可以包含三种括号:()[]{},且这三种括号可以按任意次序嵌套使用(如:…[…{…}…[…]…]…(…))。编写判别给定表达式中所含括号是否正确配对出现的算法。 算法: a)创建一个栈 b)当(当前字符不等于输入的结束字符) 如果当前字符不是括号符,则忽略它 如果字符是一个开分隔符(如【,{,)...

无意呢的博客 5806

智算中心建设项目初步设计方案

本项目面向区级政府、智算中心及文旅从业者,聚焦某区智算中心一期建设,响应数字经济与智慧城市建设政策,推动文旅产业升级。遵循统筹规划、数据驱动原则,目标打造智慧文旅样板。建设内容涵盖云网数据底座(以租代建)、数据中台(全生命周期管理)、智慧文旅平台(含“一机游”电商)及气象监测等配套,采用前后端架构与低代码开发,强化三级等保与纵深防御,实现安全可控。方案融合多类资源目录,提供从设计到运营的完整技术支撑,助力区域智算与文旅深度融合。

cdfunlove的博客 111

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: java中栈的应用-大数的相加
下一篇: HttpSession对象的详解与实战操作
oldbig_lin
博客等级 码龄10年 78粉丝 72原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值