package com.daelly.algorithm.stack.express;
import java.util.Stack;
/**
* 中缀表达式转后缀表达式
* 使用的数据结构:一个栈
* 思路:
* 遍历中缀表达式,如果当前字符不是操作符(+、-、*、/、(、)),直接将当前字符append到结果。
* 如果是操作符,循环和栈顶的操作符比较优先级,大于栈顶操作符优先级则入栈,否则pop栈顶操作符到结果串;直到条件不满足或栈为空或碰到'(';
* '(',如果不是')'碰到它,则将他看做子栈。
* 遍历完中缀串后,将栈里残留的操作符一次append到结果。
* @author daelly
*
*/
public class Infix2PostfixExp {
public static String infix2postfix(String exp) {
Stack<Character> ops = new Stack<>();
StringBuffer sb = new StringBuffer();
for(int i=0;i<exp.length();i++) {
char ch = exp.charAt(i);
if(!isOperator(ch)) {
sb.append(ch);
continue;
} else if(ops.isEmpty()||ops.peek()=='(') {
ops.push(ch);
continue;
}
switch (ch) {
case '+':
case '-':
while(!ops.isEmpty() && ops.peek()!='(') {
sb.append(ops.pop());
}
ops.push(ch);
break;
case '*':
case '/':
while(!ops.isEmpty() && ops.peek()!='+' && ops.peek()!='-'){
sb.append(ops.pop());
}
ops.push(ch);
break;
case '(':
ops.push(ch);
break;
case ')':
char top = '\0';
while((top=ops.pop())!='(') {
sb.append(top);
}
break;
default:
break;
}
}
while(!ops.isEmpty()) {
sb.append(ops.pop());
}
return sb.toString();
}
/**
* 是否是操作符
* @param ch
* @return
*/
public static boolean isOperator(char ch) {
return ch=='+' || ch=='-' || ch=='*' || ch=='/' || ch=='(' || ch==')';
}
public static void main(String[] args) {
String exp = "a+b*c";
System.out.println(infix2postfix(exp));
exp = "a*(b+c)";
System.out.println(infix2postfix(exp));
exp = "a+b*c-d*(e+f*g-h)";
System.out.println(infix2postfix(exp));
}
}
中缀转后缀表达式
最新推荐文章于 2022-11-20 16:02:35 发布