1.首先將中綴字符串放入集合列如: (3+20)*(3-10) - -> [(, 3, +, 20, ), *, 3, -, 10]
1.數字的ascll碼爲 48-57 如果是運算符或括號直接加入集合
2.在不越界和是數字的情況下, 一直循環拼接多位數 爲字符串 str
public List<String> InfixStrToInfixList(String expression) {
List<String> arrayList = new ArrayList<>();
int index = 0; //索引
String str; //拼接多位數
do {
//如果是非數字,加入集合
if (expression.charAt(index) < 48 || expression.charAt(index) > 57) {
arrayList.add(expression.charAt(index) + "");
index++;
} else { //是一個數, 需要考慮多位數
str = ""; //拼接前 先將str置空
//沒有越界,並且是數字就一直拼接
while (index < expression.length() && expression.charAt(index) >= 48 && expression.charAt(index) <= 57) {
str += expression.charAt(index);
index++;
}
arrayList.add(str); //str 拼接完成
}
} while (index < expression.length());
return arrayList; }
2.中綴表達式集合轉換爲 後綴表達式集合 [(, 3, +, 20, ), *, 3, -, 10] -> [3, 20, +, 3, 10, -, *]
1.定義棧 operatorStack 存放符號 2.定義集合 numbersList 存放數據及最終 轉換完成的 表達式
3.遍歷 中綴表達式 如果item是數字直接加入數據集合 如果是 "(" 直接加入符號棧
4.如果item是 " ) " 就循環彈出 符號棧棧頂 加入數據集合 ,直到遇到 "(" ,
循環完成 彈出符號棧的 "(" ,相當於將( ) 中間的符號和數字加入數據集合 並消除 ( )
5.如果是item 是運算符,分兩種情況:
1. item 優先級 小於等於 符號棧 棧頂的優先級, 就將 符號棧彈出加入數據集合 ,一直循環直到item 優先級大於棧頂,
再將item入符號棧
2. item 優先級 大於 符號棧 棧頂的優先級,直接入符號棧
6.最後將剩餘在符號棧的符號依次彈出 加入到數據集合, 集合順序輸出就爲後綴表達式
public List<String> infixListToSuffixList(List<String> InfixList) {
Stack<String> operatorStack = new Stack<>(); 存放符號棧
List<String> numbersList = new ArrayList<>(); 存放數據集合
for (String item : InfixList) {
if (item.matches("\\d+")) { //是數字,直接入數據集合
numbersList.add(item);
} else if (item.equals("(")) { //是左括號,直接入符號棧
operatorStack.push(item);
} else if (item.equals(")")) { //是右括號,彈出符號棧到數據集合,直到遇到左括號
while (!operatorStack.peek().equals("(")) { //直到遇到左括號
numbersList.add(operatorStack.pop()); //彈出符號棧到數據集合
}
operatorStack.pop(); //彈出 "(" ,就是消除括號
} else { //是運算符
* 當 item 優先級小於等於 operatorStack棧頂優先級,
* 將符號棧彈出一個加入數據集合,再將item與operatorStack下一個運算符比較,直到item大於它
while (operatorStack.size() != 0
&& OperatorGrade(item) <= OperatorGrade(operatorStack.peek())) {
numbersList.add(operatorStack.pop());
}
operatorStack.push(item); //最後還要將 item 加入符號棧
}
}
while (operatorStack.size()!=0){ //將剩餘在 符號棧中的 符號加入數據集合
numbersList.add(operatorStack.pop());
}
return numbersList; //最終集合就爲 後綴表達式 }