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 ...
随机推荐
- 【辅助工具】IDEA使用
IDEA使用 快捷键 快捷键 alt+enter:代码错误智能提示 alt+up:上个方法 alt+down:下个方法 alt+1:快速定位到项目窗口,还可边按键盘输文件名查找文件 alt+F7:定位 ...
- AtCoder Beginner Contest 162 C~F
比赛链接:Here AB水题, C - Sum of gcd of Tuples (Easy) 题意:\(\sum_{a=1}^{K} \sum_{b=1}^{K} \sum_{c=1}^{K} g ...
- 《3D编程模式》写书-第4次记录
大家好,这段时间我完成了"再看设计原则"的初稿,包括了设计基础.单一职责原则.依赖倒置原则.接口隔离原则.合成复用原则.最少知识原则.开闭原则 目前我已经完成了所有的初稿,后面会进 ...
- 【Printf】CubeMX生成MDK工程实现printf功能注意点
重定向printf int fputc(int ch, FILE *f) { /* Write a character to the USART */ USART1->DR = ch; /* L ...
- 2023 SHCTF-校外赛道 MISC WP
WEEK1 请对我使用社工吧 提示:k1sme4的朋友考到了一所在k1sme4家附近的大学,一天,k1sme4的朋友去了学校对面的商场玩,并给k1sme4拍了一张照片,你能找到他的学校吗? flag格 ...
- 类外static函数定义要不要加static关键字?
类外static函数定义要不要加static关键字? 先说答案:不需要. 错误代码: #include<iostream> #include<memory> using nam ...
- Matplotlib.pyplot.scatter 散点图绘制
Matplotlib.pyplot.plot 绘图 matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, no ...
- [转帖]k8s集群部署工具kubeadm详解
https://zhuanlan.zhihu.com/p/670125857 kubeadm是快捷创建Kubernetes集群的最佳实践工具,我们只需用kubeadm init 和 kubeadm j ...
- [转帖]ESXi主机RAID卡_HBA卡_网卡 型号_固件_驱动查询
https://www.cnblogs.com/vincenshen/p/12332142.html 一.RAID卡/HBA卡 型号_固件_驱动查询 1. 查询所有SCSI设备列表 # esxcfg- ...
- [转帖]JMeter InfluxDB v2.0 listener plugin
https://github.com/mderevyankoaqa/jmeter-influxdb2-listener-plugin Support my Ukrainian Family ️ Lik ...