中缀转后缀:中缀表达式转换为后缀表达式
大概意思就是:遇到数字就输出,遇到符号(包括括号)就压入栈,如果当前符号优先级比栈顶的低,就把栈顶的符号输出,平级的也都输出,到左括号(优先级最高为止),然后当前符号入栈,如果遇到右括号,就将符号栈顶的符号依次输出,遍历完成之后,栈里的符号依次输出即可;括号不用输出;
注:这里的后转中,后缀含括号;
package OffLineTest;
/*
* 中缀表达式向后缀表达式的转换方法:
规则:从左到右遍历中缀表达式的每个数字和符号,
若是数字就输出,即成为后缀表达式的一部分;
若是符号,就判断当前符号与栈顶符号的优先级,
如果是右括号或者是优先级低于栈顶符号(乘除优先加减),
则栈顶元素依次出栈并输出(全部输出,如果是右括号,则到左括号输出为止),
当前符号进栈,如此进行直到最终输出后缀表达式。
* */
/*
输入后缀表达式:9(31)-3*+12/+
转为字符数组:[9, (, 3, 1, ), -, 3, *, +, 1, 2, /, +]
反转:[+, /, 2, 1, +, *, 3, -, ), 1, 3, (, 9]
存入栈num中的形式:2/1+3*)1-3(+9
输出中缀表达式:9+(3-1)*3+1/2
* 后缀转中缀思路:将后缀反转存为 midReverse数组,符号存在栈sign中,结果存在栈 num 中,
* 遍历midReverse ,遇到符号就存入sign ,
* 判断下个字符是否为左括号')',直接输入num,(因为括号表达式的第一个括号后面跟的的数字不是符号,但第二个匹配的括号后面跟的是符号,这里要弄清楚,因为是反序遍历,然后最终结果是将num的栈顶的元素一个个输出,所有括号是反的;)
* 遇到数字就存入num,紧接着删除sign的栈顶元素并存入num(因为中缀表达式为一个数字一个符号的形式),
* 判断下个字符是否为左括号'(',若是,则将'('存入,并删除sign的栈顶元素存入num,如例子所示,'2/1+3*)1-3(','('左括号之后应该为‘+’号,如果不设置这个条件,输出的就是'9'了;
* */
import java.util.*;
public class InfixExpression {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
char[] mid = in.nextLine().toCharArray();
System.out.println("输入: "Arrays.toString(mid));
char[] midReverse = new char[mid.length];
for (int i = 0; i < mid.length; i++) {
midReverse[i] = mid[mid.length - 1 - i];
}
System.out.println("反转后: "Arrays.toString(midReverse));
Stack<Character> sign = new Stack<Character>();
Stack<Character> num = new Stack<Character>();
Map<Character, Integer> signMap = new HashMap<Character, Integer>();
signMap.put('+', 1);
signMap.put('-', 1);
signMap.put('*', 2);
signMap.put('/', 2);
Character c;
Character temp;
for (int i = 0; i < midReverse.length; i++) {
c = midReverse[i];
if (signMap.containsKey(c))
sign.push(c);
else if ((Character.isDigit(c))) {
// if (sign.isEmpty()) continue;
num.push(c);
if( i == midReverse.length -1) break;
if(midReverse[i+1] == '(') {
num.push('(');
i +=1;
}
temp = sign.pop();
num.push(temp);
} else if ((c == ')')) {
num.push(c);
}
}
//output
System.out.print("中缀表达式:");
char a;
int len = num.size();
for(int i = 0; i < len; i ++){
a = num.pop();
System.out.print( a);
}
}
}