14.java 中缀表达式转后缀表达式
思路如下:
1、初始化两个栈,运算符栈和中间结果栈
2、从左至右扫描
3、遇到数时直接压入s2
4、遇到运算符时,比较其与s1栈顶的优先级,有如下几种情况:
1)s1为空或栈顶为“(”或此运算符优先级大于s1栈顶符优先级时,直接入栈
2)s1栈顶运算符优先级大于等于该运算符时,不断从s1栈中弹出栈顶 并压入s2直到s1为空或优先级大于s1栈顶。然后将此运算符压入s1
5、遇到括号时:
1)为左括号则直接压入s2
2)为右扩号时则不断弹出s1栈顶压入s2直到遇到左括号时,停止弹出并将这一对括号丢弃
6、扫描到最右边时结束循环
7、将s1中的运算符依次弹出并压入s2
8、依次弹出s2中的元素并输出,结果的逆序则为后缀表达式。
主要依赖两个方法,
1、将中缀表达式分割转换为一个list
需要考虑多位数,遍历字符串s,不是数字则直接add入list,是数字则进入while循环直到结束或得到的后一位不为数字了结束拼接,add入list刚刚得到的拼接字符串
public static List<String> tolist(String s){
List<String> list=new ArrayList<String>();
String str="";
char ch=' ';
int i=0;
do {
if((s.charAt(i)<48)||(s.charAt(i)>57)){
list.add(""+s.charAt(i));
i++;
}else {
str="";
while (i<s.length()&&s.charAt(i)>=48&&s.charAt(i)<=57){
str+=s.charAt(i);
i++;
}
list.add(str);
}
}while (i<s.length());
return list;
}
2、将分割后的list转换为后缀表达式
定义两个栈,但由于s2没有pop的操作且之后还要倒序输出所以这里以list来代替栈。遍历list,依据上述描述来写逻辑。
public static List<String> parseList(List<String> list){
Stack<String> stack=new Stack<String>();
List<String> ls=new ArrayList<String>();
for (String item:list){
if(item.matches("\\d+")){
ls.add(item);
}else if (item.equals("(")){
stack.push(item);
}else if (item.equals(")")){
while (stack.size()!=0&&!stack.peek().equals("(")){
ls.add(stack.pop());
}
stack.pop();
}else {
while (stack.size()!=0&&oper.getvalue(stack.peek())>=oper.getvalue(item)){
ls.add(stack.pop());
}
stack.push(item);
}
}
while (stack.size()!=0){
ls.add(stack.pop());
}
return ls;
}
14.java 中缀表达式转后缀表达式的更多相关文章
- 【java】中缀表达式转后缀表达式 java实现
算法: 中缀表达式转后缀表达式的方法:1.遇到操作数:直接输出(添加到后缀表达式中)2.栈为空时,遇到运算符,直接入栈3.遇到左括号:将其入栈4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出 ...
- 中缀表达式转后缀表达式(Java代码实现)
后缀表达式求值 后缀表达式又叫逆波兰表达式,其求值过程可以用到栈来辅助存储.例如要求值的后缀表达式为:1 2 3 + 4 * + 5 -,则求值过程如下: 遍历表达式,遇到数字时直接入栈,栈结构如下 ...
- Java堆栈的应用2----------中缀表达式转为后缀表达式的计算Java实现
1.堆栈-Stack 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...
- 数据结构Java实现06----中缀表达式转换为后缀表达式
本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后 ...
- .net表达式计算器(中缀表达式转后缀表达式,支持20多个数学函数,支持函数嵌套)
最近在网上查了一下表达工计算器的类库,发现Java版本的有一个比较成熟的叫W3EVal,好像是一个IBM工程师写的,.net就很少了(可能是我了解不够多),但投机取巧的实现思路有很多,比如: (1)将 ...
- 数据结构(3) 第三天 栈的应用:就近匹配/中缀表达式转后缀表达式 、树/二叉树的概念、二叉树的递归与非递归遍历(DLR LDR LRD)、递归求叶子节点数目/二叉树高度/二叉树拷贝和释放
01 上节课回顾 受限的线性表 栈和队列的链式存储其实就是链表 但是不能任意操作 所以叫受限的线性表 02 栈的应用_就近匹配 案例1就近匹配: #include <stdio.h> in ...
- C语言- 基础数据结构和算法 - 09 栈的应用_中缀表达式转后缀表达式20220611
09 栈的应用_中缀表达式转后缀表达式20220611 听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/ ...
- 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现
#!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...
- RPN-逆波兰计算器-中缀表达式转后缀表达式-javascript
1.利用栈(Stack)来存储操作数和操作符: 2.包含中缀表达式转后缀表达式的函数,这个是难点,也是关键点: 2.1.将输入字符串转为数组: 2.2.对转换来的字符进行遍历:创建一个数组,用来给存储 ...
- 练习3.20 a 将中缀表达式转换为后缀表达式
//将中缀表达式转换为后缀表达式 int main() { ; ]={,,,,,,,}; char tmp; PtrToStack s; s = CreateStack( MaxSize ); ) { ...
随机推荐
- RESTful相关信息整理
RESTful相关信息整理 参考:可以看的出来我是阮一峰的忠实读者 阮一峰的<理解RESTful架构> https://www.ruanyifeng.com/blog/2011/09/re ...
- 一文详解数仓GaussDB(DWS) 函数出参带出方式
摘要:本文主要讲解DWS函数出参带出方式. 本文分享自华为云社区<GaussDB(DWS)功能 -- 函数出参 #[玩转PB级数仓GaussDB(DWS)]>,作者:譡里个檔 . DWS的 ...
- Spring02---IOC-Debug查看Bean的实例化过程
1 简介 springIOC它是对bean进行管理. 我们通常可以通过xml.properties.yml.注解等来配置bean的信息 spring读取这些配置信息,解析,生成BeanDefiniti ...
- odoo 为可编辑列表视图字段搜索添加查询过滤条件
实践环境 Odoo 14.0-20221212 (Community Edition) 需求描述 如下图,列表网仓记录详情页面(form视图),编辑内联视图中的货主记录,为货主和仓库字段搜索,添加过滤 ...
- ctfshow-web入门-SSTI学习
千万要仔细,不要拼错单词 千万要仔细,不要拼错单词 千万要仔细,不要拼错单词 web 361 payload name={{[].__class__.__base__.__subclasses__() ...
- Vulhub 漏洞学习之:ActiveMQ
Vulhub 漏洞学习之:ActiveMQ 目录 Vulhub 漏洞学习之:ActiveMQ 1 ActiveMQ反序列化漏洞(CVE-2015-5254): 1.1 漏洞利用过程 2 ActiveM ...
- 【论文笔记】UNet
语义分割的U-Net网络结构Unet是2015年诞生的模型,它几乎是当前segmentation项目中应用最广的模型.Unet能从更少的训练图像中进行学习,当它在少于40张图的生物医学数据集上训练时, ...
- ATC:一个能将主流开源框架模型转换为昇腾模型的神奇工具
摘要:本文介绍了昇腾CANN提供的模型转换工具ATC,介绍了其功能.架构,并以具体样例介绍了该工具的基本使用方法以及常用设置. 本文分享自华为云社区<使用ATC工具将主流开源框架模型转换为昇腾模 ...
- PostgreSQL 按拼音排序 - convert to GBK/EUC_CN coding
背景 国内的应用,在文本排序上基本都是按照拼音来进行排序的. 在不同的字符集中,汉字的编码可能不一样,比如UTF8和GBK,其中GBK是按拼音的顺序进行编码的,而UTF8则不是. 所以如果你的数据库使 ...
- webgl 系列 —— 绘制一个点(版本2、版本3、版本4、版本5)
绘制一个点 我们初步认识了 webgl,本篇主要围绕绘制一个点的示例,逐步实现下面功能: 点的位置从 js 传入着色器 点的大小由 js 传入着色器 通过鼠标点击绘点 通过鼠标点击绘点,并改变点的颜色 ...