中綴表示式轉為字尾表示式
阿新 • • 發佈:2021-06-20
/**
* Created With IntelliJ IDEA.
* Descriptions:
* 1、定義一個棧stack,用來接收運算子;定義一個char型別陣列chars,用於接收輸出結果
* 2、從左到右遍歷字串,遇到字元新增到輸chars,遇到運算子棧為空入棧,不為空,
* 當前運算子A和棧頂運算子B比較,如果A的優先順序大於B,那麼A入棧,否則A出棧,並新增到chars,B入棧
* 3、遇到左括號入棧,右括號則進行出棧操作,直到匹配到左括號,出棧結束
* 4、將棧中剩餘元素加入到chars中
* User:Mr.Du
* Date:2021/6/19
* Time:21:22
*/
/**
*
* @param s 輸入表示式
* @param stack 儲存操作符和括號
* @return
*/
public static String infixToPostFix(String s, Stack<Character> stack){
int index = 0;
char[] tmp = s.toCharArray();
char[] chars = new char[s.length()];
for(int i = 0;i < s.length();i++){
// (a+b)*c+d*(e+f)
if(tmp[i] >= '0' && tmp[i] <= '9'){
chars[index++] = tmp[i];
}else if(tmp[i] == '('){
stack.add(tmp[i]);
}else if(tmp[i] == '+' || tmp[i] == '-'
|| tmp[i] == '*'
|| tmp[i] == '/'){
if(!stack.isEmpty()){
char c = stack.peek();
if(c == '('){
stack.push(tmp[i]);
} else if(getPriority(tmp[i],c)){
stack.push(tmp[i]);
}else{
chars[index++] = c;
stack.pop();
stack.push(tmp[i]);
}
}else{
stack.push(tmp[i]);
}
}else if(tmp[i] == ')'){
char c;
while((c = stack.pop()) != '('){
chars[index++] = c;
}
}
}
while(!stack.isEmpty()){
chars[index++] = stack.pop();
}
return String.valueOf(chars);
}
/**
* 比較算術運算子大小
* @param a
* @param b
* @return true代表a的優先順序高於b
*/
public static boolean getPriority(char a,char b){
if((a == '*' || a == '/') && (b == '+' || b == '-')) return true;
return false;
}