/**
* 中綴表達式 轉 後綴表達式
*/
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Stack;
public class ExpressConvert {
/**
* 優先級比較
* @param operator1 比較值
* @param operator2 被比較值
* @return 小於等於返回false,大於返回true
*/
public boolean comparePrior(char operator1, char operator2) {
if('(' == operator2) {
return true;
}
if ('*' == operator1 || '/' == operator1) {
if ('+' == operator2 || '-' == operator2) {
return true;
}
}
return false;
}
/**
* 轉爲後綴表達式:
* 1、如果是"("直接壓入stack棧。
* 2、如果是")",依次從stack棧彈出運算符加到數組newExpressionStrs的末尾,知道遇到"(";
* 3、如果是非括號,比較掃描到的運算符,和stack棧頂的運算符。如果掃描到的運算符優先級高於棧頂運算符則,把運算符壓入棧。否則的話,就依次把棧中運算符彈出加到數組newExpressionStrs的末尾,直到遇到優先級低於掃描到的運算符或棧空,並且把掃描到的運算符壓入棧中。就這樣依次掃描,知道結束爲止。如果掃描結束,棧中還有元素,則依次彈出加到數組newExpressionStrs的末尾,就得到了後綴表達式。
* @param expressionStrs
* @return
*/
public List<Character> toSuffixExpression(char[] expressionStrs) {
//新組成的表達式
List<Character> newExpressionStrs = new ArrayList<Character>();
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < expressionStrs.length; i++) {
if ('('==(expressionStrs[i])) { // 如果是左括號,則入棧
stack.push(expressionStrs[i]);
} else if ('+'==expressionStrs[i] || '-' == expressionStrs[i] || '*' == expressionStrs[i] || '/' == expressionStrs[i]) {
if (!stack.empty()) { // 取出先入棧的運算符
Character s = stack.pop();
if(comparePrior(expressionStrs[i], s)) { //如果棧值優先級小於要入棧的值,則繼續壓入棧
stack.push(s);
} else { //否則取出值
newExpressionStrs.add(s);
}
}
stack.push(expressionStrs[i]);
} else if (')' == expressionStrs[i]) { //如果是')',則出棧,一直到遇到'('
while (!stack.empty()) {
char s = stack.pop();
if (!('(' == s)) {
newExpressionStrs.add(s);
} else {
break;
}
}
} else {
newExpressionStrs.add(expressionStrs[i]);
}
}
while (!stack.empty()) {
char s = stack.pop();
newExpressionStrs.add(s);
}
return newExpressionStrs;
}
public static void main(String[] args) {
String expressionStr = "5+(4-5+1)-4+(6-5+3)+2";
// 分割成表達式數組
char []expressionChrs = expressionStr.toCharArray();
List<Character> newExpressionStrs = new ExpressConvert().toSuffixExpression(expressionChrs);
Iterator<Character> iter = newExpressionStrs.iterator();
while(iter.hasNext()){
System.out.print(iter.next());
}
}
}