思路:

1.初始化两个栈 运算符栈 s1 和储存中间结果栈 s2
2. 从左到右扫描中缀表达式
3. 遇到操作数时 压入s2
4. 遇到操作符 o1 时 比较其与 S1 栈顶运算符的优先级
1)如果s1为空 或栈顶运算符为左括号 '(' 则直接将此运算符入栈
2)如果优先级高于栈顶,也直接压如运算符栈 s1
3)如果优先级低于栈顶运算符 将栈顶运算符弹出 压入s2 再次将o1与s1中的栈顶运算符比较
5.遇到括号时
1)如果是左括号'('直接压入s1
2)如果是右括号')' 则一次弹出s1栈顶的运算符,并压入s2 直到遇到左括号位置,然后将这一对括号丢弃
6.重复步骤2-5直到扫描完表达式全部内容
7.将s1中剩余内容全部依次弹出并压入s2
8.依次弹出s2中的所有元素并输出 结果的逆序即为转化后的后缀表达式
package com.seizedays.stack;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack; public class PostfixExpression {
public static void main(String[] args) {
//完成中缀表达式向后缀表达式的转换
String expression = "1+((2+3)*4)-5";
List<String> ls1 = toInfixExpressionList(expression);
System.out.println("中缀表达式对应的list: " +ls1); //=> ArrayList [1, +, (, (, 2, +, 3, ), *, 4, ), -, 2]
List<String> suffixExpressionList = parseSuffixExpreesionList(ls1);
System.out.println("后缀表达式对应的list: " + suffixExpressionList);
} //获取中缀表达式的数组
public static List<String> toInfixExpressionList(String s){
List<String> ls = new ArrayList<>();
int i = 0; // 遍历的指针
StringBuilder str; // 用于多位数的拼接
char c; //存放遍历到的字符
do{
//如果c是一个非数字,就需要加入到ls中去
if ((c = s.charAt(i)) < 48 || (c=s.charAt(i)) > 57){
ls.add("" + c);
i++;
}else {
//如果是一个数字 需要考虑多位数的问题
str = new StringBuilder();
while (i < s.length() && (c=s.charAt(i))>=48 && (c=s.charAt(i))<=57){
str.append(c); //拼接
i++;
}
ls.add(str.toString());
}
}while (i < s.length()); return ls;
} //将中缀表达式转换为对应的后缀表达式
public static List<String> parseSuffixExpreesionList(List<String> ls){
//定义两个栈
Stack<String> s1 = new Stack<>(); //符号栈
//因为s2的栈在整个转换过程中没有pop操作 而且后边要逆序输出
//因此直接使用List来替代
List<String> s2 = new ArrayList<>(); //中间结果栈 //遍历ls
for(String item : ls){
//如果是一个数,加入到s2;
if (item.matches("\\d+")){
s2.add(item);
}else if(item.equals("(")){
s1.push(item);
}else if(item.equals(")")){
//如果是右括号')' 则一次弹出s1栈顶的运算符,并压入s2 直到遇到左括号位置,然后将这一对括号丢弃
while (!s1.peek().equals("(")){
s2.add(s1.pop());
}
s1.pop(); //将 ( 弹出s1栈 消除小括号
}else {
//当item小于等于s1栈顶运算符的优先级的时候 将s1栈顶的运算符弹出 加入到s2中
while (s1.size() != 0 && Operation.getValue(s1.peek()) >= Operation.getValue(item)){
s2.add(s1.pop());
}
//将item压入栈顶
s1.push(item);
}
}
//将s1中剩余的运算符依次压入s2
while (s1.size() != 0){
s2.add(s1.pop());
}
return s2; //因为是存放到一个list中,因此按顺序输出就是对应的逆波兰表达式
}
} //编写一个类 用于比较运算符的优先级
class Operation{
private static int ADD = 1;
private static int SUB = 1;
private static int MUL = 2;
private static int DIV = 2;
//写一个方法 返回对应的优先级
public static int getValue(String operation){
int result = 0;
switch (operation){
case "+":
result = ADD;
break;
case "-":
result = SUB;
break;
case "*":
result = MUL;
break;
case "/":
result = DIV;
break;
default:
System.out.println("不能存在该运算符");
break;
} return result;
} }

Java实现将中缀表达式转换到后缀表达式的更多相关文章

  1. [Swust OJ 322]--东6宿舍灵异事件(中缀表达式转化为后缀表达式的简单运用)

    题目链接:http://acm.swust.edu.cn/problem/322/ Time limit(ms): 1000 Memory limit(kb): 65535     Descripti ...

  2. SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式

    数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运 ...

  3. 数据结构实验之栈与队列二:一般算术表达式转换成后缀式(SDUT 2132)

    题目链接 #include <bits/stdc++.h> using namespace std; typedef long long ll; int ok(char ch, char ...

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

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

  5. javascript使用栈结构将中缀表达式转换为后缀表达式并计算值

    1.概念 你可能听说过表达式,a+b,a+b*c这些,但是前缀表达式,前缀记法,中缀表达式,波兰式,后缀表达式,后缀记法,逆波兰式这些都是也是表达式. a+b,a+b*c这些看上去比较正常的是中缀表达 ...

  6. 《java数据结构与算法》笔记-CH4-8栈结构实现后缀表达式计算结果

    /** * 中缀表达式转换成后缀表达式: 从输入(中缀表达式)中读取的字符,规则: 操作数: 写至输出 左括号: 推其入栈 右括号: 栈非空时重复以下步骤--> * 若项不为(,则写至输出: 若 ...

  7. NYOJ--257--郁闷的C小加(一)(中缀表达式变后缀表达式 )

    郁闷的C小加(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说 ...

  8. C++做四则运算的MFC计算器(二)栈转换和计算后缀表达式

    上篇写了MFC界面搭建,这篇就写实现计算.涉及到数据结构,对新手很不友好. 虽然是MFC程序,但是能灵活地分离后台代码,自行构建控制台程序. 上篇文章链接:C++做四则运算的MFC计算器(一)MFC界 ...

  9. 数据结构之栈—强大的四则复杂运算计算器(超过windows自带的科学计算器)【中缀转后缀表达式】

    比windows自带计算器还强的四则复杂运算计算器! 实测随机打出两组复杂算式:-7.5 * 6 / ( -2 + ( -6.5 -  -5.22 ) )与7.5+-3*8/(7+2) windows ...

  10. C#数据结构与算法系列(十):中缀表达式转后缀表达式

    1.具体步骤 1)初始化两个栈:运算符栈s1和储存中间结果的栈s2:2)从左至右扫描中缀表达式:3)遇到操作数时,将其压s2:4)遇到运算符时,比较其与s1栈顶运算符的优先级:     (1)如果s1 ...

随机推荐

  1. 它来了!真正的 python 多线程

    哈喽大家好,我是咸鱼 几天前,IBM 工程师 Martin Heinz 发文表示 python 3.12 版本回引入"Per-Interpreter GIL",有了这个 Per-I ...

  2. OAuth2.0回调函数用html页面转发给controller

    OAuth2.0授权中有个回调函数,就是请求授权服务后,它会将你需要的code(假设code就是你需要的数据)发送给你的回调函数(你对外开放的一个url地址用以接收参数) 注:这个回调函数有点讨厌为什 ...

  3. 2、springboot创建多模块工程

    系列导航 springBoot项目打jar包 1.springboot工程新建(单模块) 2.springboot创建多模块工程 3.springboot连接数据库 4.SpringBoot连接数据库 ...

  4. wireshark 抓包使用

    本文为博主原创,转载请注明出处: 在项目开发过程当中,尤其在联调和测试功能的使用,经常会用到抓包,用抓包进行问题的定位. 所以记录一下wireshark的使用,如何抓包,分析,保存等. wiresha ...

  5. linux 开机默认进入命令行模式

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  6. IL合集二

    引言 在第一篇关于IL的文章中,我们写了一些IL的相加,创建对象,循环以及实现TryCatch的一些功能,接下来,为大家带上后续关于IL的更新,其中包括,类型转换,以及条件判断,还有定义字段,定义属性 ...

  7. MySQL高可用九种方案

    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 参考视频 MMM 方案(单主) MySQL 高可用方案之 MM ...

  8. [转帖]解决Java/MySQL性能问题的思路

    https://plantegg.github.io/2023/08/28/%E8%A7%A3%E5%86%B3%E9%97%AE%E9%A2%98%E6%80%9D%E8%B7%AF/ 10年前写的 ...

  9. [转帖]9.2 TiFlash 架构与原理

    9.2 TiFlash 架构与原理 相比于行存,TiFlash 根据强 Schema 按列式存储结构化数据,借助 ClickHouse 的向量化计算引擎,带来读取和计算双重性能优势.相较于普通列存,T ...

  10. [转帖]使用 TiUP 部署 TiDB 集群

    https://docs.pingcap.com/zh/tidb/stable/production-deployment-using-tiup TiUP 是 TiDB 4.0 版本引入的集群运维工具 ...