输入一个字符串计算式子,输出其中缀表达式。
先将计算式子转换为list
public static List<String> infexList(String s){
int index = 0;
String str;
final List<String> strings = new ArrayList<>();
while(index<s.length()){
//字符0代表48,9代表57
//代表a是非数字
if(s.charAt(index)<48||s.charAt(index)>57){
str = "";
str = str + s.charAt(index);
strings.add(str);
index++;
}else {
str = "";
//当符合这个条件的时候还要对下一个字符进行判断,注意第一个字符是符合的,当不是数字的时候才跳出。
while(index<s.length()&& (s.charAt(index)>=48&&s.charAt(index)<=57)){
str = str + s.charAt(index);
index++;
}
strings.add(str);
}
}
return strings;
}
当判断到数字的时候,在while语句中要把当前的index在进行判断,不可以对index++判断,这样如果不是数字的话,就回不去了。对index进行判断,当它不是数字的时候,还可以回到主while中进行再次判断。
将中缀表达式变成后缀表达式
思路分析
因为s2没有pop而且要逆序输出,故list来代替合适。
写一个方法来测试符号优先级
/**
* 写一个方法进行判断符号的优先级
* return 1 代表list取出来的符号优先级高
* @param string1 s1栈顶的符号
* @param string2 list取出来的符号
* @return
*/
public static boolean isJudge(String string1,String string2){
int a ;
int b ;
if(string1.equals("+")||string1.equals("-")){
a = 0;
} else if (string1.equals("*") || string1.equals("/")) {
a = 1;
}else{
a = 0;
}
if (string2.equals("*") || string2.equals("/") ) {
b = 1;
}else if (string2.equals("+") || string2.equals("-")) {
b = 0;
}else {
b = 0;
}
if(b - a > 0){
return true;
}else if(string1.equals("(")){
return true;
}
else{
return false;
}
}
如果返回true则代表list取出数据优先级高,否则栈中优先级高。
综合代码
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
* FileName: InfexToSuffix
*
* @Author:luguobao Date: //19:08
* Description:将中缀表达式变后缀表达式
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
public class InfexToSuffix {
public static void main(String[] args) {
String s = "1+(5+2*3)-1+2/(3+5)";
final List<String> strings = infexList(s);
infexTosuffix(strings);
System.out.println(isJudge("+","*"));
}
/**
*将字符串变成list
* @param s
* @return
*/
public static List<String> infexList(String s){
int index = 0;
String str;
final List<String> strings = new ArrayList<>();
while(index<s.length()){
//字符0代表48,9代表57
//代表a是非数字
if(s.charAt(index)<48||s.charAt(index)>57){
str = "";
str = str + s.charAt(index);
strings.add(str);
index++;
}else {
str = "";
//当符合这个条件的时候还要对下一个字符进行判断,注意第一个字符是符合的,当不是数字的时候才跳出。
while(index<s.length()&& (s.charAt(index)>=48&&s.charAt(index)<=57)){
str = str + s.charAt(index);
index++;
}
strings.add(str);
}
}
return strings;
}
/**
* 将前缀表达式变成后缀表达式
*/
public static List<String> infexTosuffix(List<String> list){
//s1用来存符号,s2用来存数字
final Stack<String> s1 = new Stack();
final ArrayList<String> s2 = new ArrayList<>();
int index = 0;
for (String str:
list) {
//用正则表达式来匹配数字“+”可以匹配到多个数字
if(str.matches("\\d+")){
s2.add(str);
}else {
//如果是字符的话则进行判断
if (str.equals("(")){
s1.push(str);
}else if(s1.isEmpty()){
s1.push(str);
}else if(str.equals(")")){
//在取到“(”之前将里面的符号取出来,注意如果栈中没有数据是不能peek的
while(!s1.isEmpty()&&!s1.peek().equals("(")){
s2.add(s1.pop());
}
//将“(”弹出
s1.pop();
//当字符是乘或者除的时候
}
//需要写一个方法来判断符号的优先级,如果list元素的优先级高,直接压栈
else if(isJudge(s1.peek(),str)){
s1.push(str);
//如果list优先级低或者相等,则将s1栈顶元素取出来,然后再进行比较
}else{
while(!s1.isEmpty()&&!isJudge(s1.peek(),str)){
s2.add(s1.pop());
}
s1.push(str);
}
}
}
//再将s1中的元素压倒s2上
while(!s1.isEmpty()){
s2.add(s1.pop());
}
System.out.println(s2);
return s2;
}
/**
* 写一个方法进行判断符号的优先级
* return 1 代表list取出来的符号优先级高
* @param string1 s1栈顶的符号
* @param string2 list取出来的符号
* @return
*/
public static boolean isJudge(String string1,String string2){
int a ;
int b ;
if(string1.equals("+")||string1.equals("-")){
a = 0;
} else if (string1.equals("*") || string1.equals("/")) {
a = 1;
}else{
a = 0;
}
if (string2.equals("*") || string2.equals("/") ) {
b = 1;
}else if (string2.equals("+") || string2.equals("-")) {
b = 0;
}else {
b = 0;
}
if(b - a > 0){
return true;
}else if(string1.equals("(")){
return true;
}
else{
return false;
}
}
}
测试结果