思路如下:

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 中缀表达式转后缀表达式的更多相关文章

  1. 【java】中缀表达式转后缀表达式 java实现

    算法: 中缀表达式转后缀表达式的方法:1.遇到操作数:直接输出(添加到后缀表达式中)2.栈为空时,遇到运算符,直接入栈3.遇到左括号:将其入栈4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出 ...

  2. 中缀表达式转后缀表达式(Java代码实现)

    后缀表达式求值 后缀表达式又叫逆波兰表达式,其求值过程可以用到栈来辅助存储.例如要求值的后缀表达式为:1 2 3 + 4 * + 5 -,则求值过程如下: 遍历表达式,遇到数字时直接入栈,栈结构如下 ...

  3. Java堆栈的应用2----------中缀表达式转为后缀表达式的计算Java实现

    1.堆栈-Stack 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

  4. 数据结构Java实现06----中缀表达式转换为后缀表达式

    本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后 ...

  5. .net表达式计算器(中缀表达式转后缀表达式,支持20多个数学函数,支持函数嵌套)

    最近在网上查了一下表达工计算器的类库,发现Java版本的有一个比较成熟的叫W3EVal,好像是一个IBM工程师写的,.net就很少了(可能是我了解不够多),但投机取巧的实现思路有很多,比如: (1)将 ...

  6. 数据结构(3) 第三天 栈的应用:就近匹配/中缀表达式转后缀表达式 、树/二叉树的概念、二叉树的递归与非递归遍历(DLR LDR LRD)、递归求叶子节点数目/二叉树高度/二叉树拷贝和释放

    01 上节课回顾 受限的线性表 栈和队列的链式存储其实就是链表 但是不能任意操作 所以叫受限的线性表 02 栈的应用_就近匹配 案例1就近匹配: #include <stdio.h> in ...

  7. C语言- 基础数据结构和算法 - 09 栈的应用_中缀表达式转后缀表达式20220611

    09 栈的应用_中缀表达式转后缀表达式20220611 听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/ ...

  8. 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现

    #!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...

  9. RPN-逆波兰计算器-中缀表达式转后缀表达式-javascript

    1.利用栈(Stack)来存储操作数和操作符: 2.包含中缀表达式转后缀表达式的函数,这个是难点,也是关键点: 2.1.将输入字符串转为数组: 2.2.对转换来的字符进行遍历:创建一个数组,用来给存储 ...

  10. 练习3.20 a 将中缀表达式转换为后缀表达式

    //将中缀表达式转换为后缀表达式 int main() { ; ]={,,,,,,,}; char tmp; PtrToStack s; s = CreateStack( MaxSize ); ) { ...

随机推荐

  1. 基于遗传算法的地图四色原理绘图上色的Python代码

      本文介绍利用Python语言,实现基于遗传算法(GA)的地图四色原理着色操作. 1 任务需求   首先,我们来明确一下本文所需实现的需求.   现有一个由多个小图斑组成的矢量图层,如下图所示.   ...

  2. 剑指Offer 05. 替换空格(java解题)

    目录 1. 题目 2. 解题思路(通用 3. 数据类型功能函数总结 4. java代码 1. 题目 请实现一个函数,把字符串 s 中的每个空格替换成%20. 示例 1: 输入:s = "We ...

  3. mysql19-锁

    1.什么是锁 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性. ...

  4. .NET Core项目部署到Windows系统Docker

    1.新建一个ASP.NET Core Web应用(模型-视图-控制器) 2. 项目启动Docker.Docker OS选择Windows 3.系统默认的dockerfile文件如下 #See http ...

  5. vue的异步组件

    异步组件 异步组件:可以在首页加载之前先加载的组件,主要是做性能优化,提高用户体验 一.基本用法 在大型项目中,我们可能需要拆分应用为更小的块,并仅在需要时再从服务器加载相关组件.Vue 提供了 de ...

  6. 3D模型在线查看工具

    3D场景工具推荐:NSDT场景编辑器. glTF Viewer 2.0是一个可以在线查看GLTF格式3D模型的,可以对模型进行显示设置.灯光设置来查看模型效果,除此之外还可以对模型进行性能分析和模型验 ...

  7. WPF BasedOn 自定义样式 例:ComboBox 组合框

    自定义样式 ComboBox 组合框 <Window.Resources> <Style x:Key="ComboBox01" TargetType=" ...

  8. 在vue-element-admin模板中去掉tui-editor

    先删除package.json的"tui-editor": "1.3.3",再安装依赖,不然会报错 1.修改package.json 删除包括tui-edito ...

  9. Angular ngx-translate 国际化实践(中文转英文)

    1.安装包 npm install @ngx-translate/core --save npm install @ngx-translate/http-loader --save 2.根模块app. ...

  10. net core 依赖注入DI

    控制反转:Inversion Of Control,简称 IOC,是面向对象中的一种设计原则,调用者不自己new实例,而是交给容器去创建,可以减轻代码的耦合度. 依赖注入:Dependency Inj ...