Java实现将中缀表达式转换到后缀表达式
思路:
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实现将中缀表达式转换到后缀表达式的更多相关文章
- [Swust OJ 322]--东6宿舍灵异事件(中缀表达式转化为后缀表达式的简单运用)
题目链接:http://acm.swust.edu.cn/problem/322/ Time limit(ms): 1000 Memory limit(kb): 65535 Descripti ...
- SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式
数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运 ...
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式(SDUT 2132)
题目链接 #include <bits/stdc++.h> using namespace std; typedef long long ll; int ok(char ch, char ...
- 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现
#!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...
- javascript使用栈结构将中缀表达式转换为后缀表达式并计算值
1.概念 你可能听说过表达式,a+b,a+b*c这些,但是前缀表达式,前缀记法,中缀表达式,波兰式,后缀表达式,后缀记法,逆波兰式这些都是也是表达式. a+b,a+b*c这些看上去比较正常的是中缀表达 ...
- 《java数据结构与算法》笔记-CH4-8栈结构实现后缀表达式计算结果
/** * 中缀表达式转换成后缀表达式: 从输入(中缀表达式)中读取的字符,规则: 操作数: 写至输出 左括号: 推其入栈 右括号: 栈非空时重复以下步骤--> * 若项不为(,则写至输出: 若 ...
- NYOJ--257--郁闷的C小加(一)(中缀表达式变后缀表达式 )
郁闷的C小加(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说 ...
- C++做四则运算的MFC计算器(二)栈转换和计算后缀表达式
上篇写了MFC界面搭建,这篇就写实现计算.涉及到数据结构,对新手很不友好. 虽然是MFC程序,但是能灵活地分离后台代码,自行构建控制台程序. 上篇文章链接:C++做四则运算的MFC计算器(一)MFC界 ...
- 数据结构之栈—强大的四则复杂运算计算器(超过windows自带的科学计算器)【中缀转后缀表达式】
比windows自带计算器还强的四则复杂运算计算器! 实测随机打出两组复杂算式:-7.5 * 6 / ( -2 + ( -6.5 - -5.22 ) )与7.5+-3*8/(7+2) windows ...
- C#数据结构与算法系列(十):中缀表达式转后缀表达式
1.具体步骤 1)初始化两个栈:运算符栈s1和储存中间结果的栈s2:2)从左至右扫描中缀表达式:3)遇到操作数时,将其压s2:4)遇到运算符时,比较其与s1栈顶运算符的优先级: (1)如果s1 ...
随机推荐
- 创建QUERY报表
一.SQ02创建信息集 该事务代码用于查询需要的表,及表之间的关联关系 首先设置查询区域,标准区域中所建立的信息集仅在当前客户端使用,全局区域中建立的信息集可以跨client 创建信息集 选择基础表关 ...
- SpringCloud学习 系列六、服务平滑离线
系列导航 SpringCloud学习 系列一. 前言-为什么要学习微服务 SpringCloud学习 系列二. 简介 SpringCloud学习 系列三. 创建一个没有使用springCloud的服务 ...
- uni-app 预览pdf文件
安卓uni-app实现pdf文件预览功能: 1.https://mozilla.github.io/pdf.js/getting_started/#download下载 放在根目录下, 2.新建一个w ...
- Postman 压力测试
本文为博主原创,未经允许不得转载: postman 还提供了接口压力测试的功能,通过这种方式可以测试接口性能. 若接口测试需要通过pre s单独封装进行计算一些参数时,可以参考我的上一篇博客: Pos ...
- Blazor的技术优点
Blazor是一种使用.NET和C#构建客户端Web应用程序的新兴技术.它允许开发者在浏览器中直接运行.NET代码,而无需依赖JavaScript.Blazor的技术优点主要表现在以下几个方面: 单一 ...
- 使用QQ屏幕识图实现识别表格功能
1.问题 目前市场上的OCR工具对于识别表格功能均是采取了收费制度,但我们时常要进行一些表格的复制(原表格为图片) 便可以使用QQ或钉钉自带的功能来实现 2.解决 1.QQ屏幕识图 先使用屏幕识图功能 ...
- 文心一言 VS 讯飞星火 VS chatgpt (185)-- 算法导论14.1 2题
二.用go语言,对于图 14-1中的红黑树 T 和关键字 x.key 为35的结点x,说明执行 OS-RANK(T,x) 的过程. 文心一言: 在红黑树中,OS-RANK(T, x) 是一个操作,用于 ...
- Laravel : 模糊查询 where orWhere
Banner::where('title', 'like', "%{$keyword}%")->orWhere('introduce', 'like', "%{$k ...
- mysql-数值函数-取整-保留小数位-求余数
- 神通数据库的varchar和nvarchar的验证
神通数据库的varchar和nvarchar的验证 登录神通数据库 isql 注意 神通数据库的默认密码是 szoscar55 Welcome to isql 2.0.56 interactive t ...