四則運算的中綴表達式轉後綴表達式
實現規則:
- 數字直接輸出
- 非數字,棧爲空或者棧頂元素爲左括號或者該符號爲左括號,直接入棧
- 如果是右括號,持續出棧並輸出符號,直到棧頂元素爲左括號,將左括號出棧(左括號只出棧,不輸出,右括號不入棧)
- 遇到運算符並且棧非空,如果棧頂元素的運算優先級大於等於該運算符的優先級,則持續出棧並輸出符號,直到棧頂元素優先級小於該運算符的優先級,將該運算符入棧
- 讀到末尾,將棧中所有元素依次輸出
代碼塊
代碼塊java代碼,例如:
/**
*
*@Description:中綴表達式 轉 後綴表達式,運算符包含'+','-','*','/','(',')';
*
*@date:2017年11月7日
*@author:cdy
*
*/
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class ReversePolishNotation {
static Stack<Character> symbolStack = new Stack<>();
static StringBuilder reversePolishNoation = new StringBuilder();
/**
* 定義運算符優先級
* @param c
* @return
*/
static int priority(char c) {
if (c == '(') {
return 0;
} else if (c == '+' || c == '-') {
return 1;
} else if (c == '*' || c == '/') {
return 2;
}
return 0;
}
/**
* 中綴表達式轉 後綴表達式
* @param expression
* @return
*/
public static String getReversePolishNotation(String expression) {
int length = expression.length();
for (int i = 0; i < length; i++) {
// 本次輸入字符
char c = expression.charAt(i);
if (Character.isDigit(c)) {
// 數字直接輸出
reversePolishNoation.append(c);
} else {
// 輸入爲運算符
if (symbolStack.isEmpty() || symbolStack.peek() == '(' || c == '(') {
// 如果棧爲空或者棧頂爲'('或者本次輸入運算符爲'(',直接入棧,進行下一次
symbolStack.push(c);
continue;
}
if (c == ')') {
// 如果輸入運算符爲')'
while (symbolStack.peek() != '(') {
// 棧頂不是'('
// 運算符持續出棧並輸出
char ch = symbolStack.pop();
reversePolishNoation.append(ch);
}
// 棧頂爲'('出棧不輸出,進行下一次
symbolStack.pop();
continue;
}
// char top = symbolStack.peek();
// int topPriority=priority(top);
int cPriority = priority(c);
while (!symbolStack.isEmpty() && priority(symbolStack.peek()) >= cPriority) {
// 棧不爲空,棧頂元素優先級大於等於本次輸入運算符的優先級
// 運算符持續出棧並輸出
char ch = symbolStack.pop();
reversePolishNoation.append(ch);
}
// 棧頂元素優先級小於本次輸入運算符的優先級,本次輸入的運算符入棧
symbolStack.push(c);
}
// 本次輸入結束
}
// 讀到輸入末尾,棧中所以元素依次輸出
while (!symbolStack.isEmpty()) {
char ch = symbolStack.pop();
reversePolishNoation.append(ch);
}
return reversePolishNoation.toString();
}
}