-
算法思想
数字直接加入后缀表达式
运算符时:
a.若为’(’,入栈;
b.若为’)’,则依次把栈中的运算符加入后缀表达式,直到出现’(’,并从栈中删除’)’;
c.若为’+’,’-’,’*’,’/’,
·栈空,入栈;
·栈顶元素为’(’,入栈;
·高于栈顶元素优先级,入栈;
·否则,依次弹出栈顶运算符,直到一个优先级比它低的运算符或’('为止;
d.遍历完成,若栈非空依次弹出所有元素。 -
代码
import java.util.Scanner;
import java.util.Stack;
class Test {
public static void main(String[] args) {
String expression = "";
Scanner input = new Scanner(System.in);
expression = input.nextLine();
input.close();
System.out.println(change(expression));
}
public static String change(String expression) {
String postfixExpression = ""; // 记录后缀表达式
Stack<String> symbolStack = new Stack<>(); // 符号栈
String[] expressionList = expression.split(" "); // 根据空格拆分存放在数组中
for (String str : expressionList) {
if (!isOperator(str)) { // 不是操作符时
postfixExpression += (str + " "); // 记录
continue;
}
if (symbolStack.empty()||str.equals("(")) { // 开始时栈为空时 或者 遇到"("
symbolStack.push(str);
continue;
}
if (str.equals(")")) { // 遇到")"
while (true) { // 不为空
if (symbolStack.peek().equals("(")) { // 如果遇到左括号的时候退出循环
symbolStack.pop();
break;
}
postfixExpression += (symbolStack.pop() + " "); // 记录
} // 将当前符号入栈
continue;
}
if (!comp(symbolStack.peek(), str)) { // 判断是否出栈
while (!symbolStack.empty()) { // 不为空
if (symbolStack.peek().equals("(")) // 如果遇到左括号的时候退出循环
break;
postfixExpression += (symbolStack.pop() + " "); // 记录
}
}
symbolStack.push(str); // 将当前符号入栈
}
while (!symbolStack.empty()) // 最后将剩余的出栈
postfixExpression += (symbolStack.pop() + " ");
return postfixExpression.trim();
}
public static boolean isOperator(String str) { // 是否为操作符
String[] operator = { "+", "-", "*", "/", "(", ")" };
for (String ope : operator) {
if (str.equals(ope))
return true;
}
return false;
}
public static boolean comp(String str1, String str2) { // 判断操作符str2优先级是否比str1大
char c1 = str1.charAt(0);
char c2 = str2.charAt(0);
char[] operator = "+-*/".toCharArray();
int n1 = -1, n2 = -1;
for (int i = 0; i < operator.length; i++) {
if (operator[i] == c1)
n1 = i;
if (operator[i] == c2)
n2 = i;
}
return n2 / 2 > n1 / 2;
}
}
例:输入:a + b * c + ( d * e + f ) * g
结果为:a b c * + d e * f + g * +