Java中缀转后缀表达式
看了网上其他人写的感觉好复杂,难以理解,我感觉我的实现很简单,容易明白,可以借鉴!哈哈
注释很全,不解释了
public class Demo {
@Test
public void main(){
String hou = zhongTransHou("2+((1-3)*4)-2");
System.out.println(hou);
}
public String zhongTransHou(String zhong){
//创建一个栈存放运算符使用
Stack<Character> ysfz = new Stack<Character>();
StringBuilder hz = new StringBuilder();
//扫描整个运算表达式
char[] chars = zhong.toCharArray();
for (char c : chars) {
//当前扫描的是运算符
if(c == '+' || c== '-' || c== '*' || c=='/'||c==')'||c=='('){
//进行优先级和右括号的判断
//如果当前元素是右括号的话
if(c == ')'){
while(ysfz.peek()!='('){//遍历部分栈,只要栈顶不是"("都要出战,并且匹配到"("本身也要出栈
char top = ysfz.pop();//移除栈顶元素并返回移除的值
hz.append(top);
}
//执行到这里说明已经清空了所有的在"("上面的运算符,此后将本身也给清楚
ysfz.pop();
}else if(ysfz.isEmpty()){//当前栈是空的话
ysfz.push(c);//直接入栈
}else if(curYSFIsGao(c,ysfz)){//当前运算符比栈顶运算符高的话
ysfz.add(c);
}else if(!curYSFIsGao(c,ysfz)){//当前运算符比栈顶运算符低的话
while(!ysfz.isEmpty()){//遍历整个栈
char top = ysfz.pop();
hz.append(top);
}
//执行到这里栈已经是空了,现在将当前元素入栈
ysfz.push(c);
}
}else{//当前扫描的数字
hz.append(c);
}
}
//真个表达式扫描之后,出栈
while(!ysfz.isEmpty()){
char top = ysfz.pop();
hz.append(top);
}
return hz.toString();
}
/**
* 判断当前元素和栈顶元素的优先级,这里面间接的判断如果是“(”也是入栈(优先级高就入栈)
* @param c
* @param ysfz
* @return
*/
private boolean curYSFIsGao(char c,Stack<Character> ysfz) {
boolean isGao = true;//默认是高
//拿取栈顶元素,和当前传入元素做比较优先级
char top = ysfz.peek();
if(c == '+' || c == '-'){
if(top == '*' || top == '/'){
isGao = false;
}
//遇到加减或者"("默认高
}
//当前是乘除的话默认高,也就是都向栈里面添加
return isGao;
}
}