package com.github.ipk2015.coding2017.basic.stack.expr;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Stack;
public class InfixToPostfix {
public static List<Token> convert(String expr) {
int len = expr.length();
char c,temp;
Stack stack = new Stack();
StringBuffer buffer = new StringBuffer();
for(int i = 0;i<len;i++){
c = expr.charAt(i);
if(Character.isDigit(c)){
buffer.append(c); //数字字符直接放进buffer里
}else{
buffer.append(" ");
if('(' == c){
stack.push(c); // ( 时先放进字符栈里
}else if(')' == c){ // ) 时将栈里到上一个(之间的字符全部压出到buffer里
temp = (Character)stack.pop();
while(temp!='('){
buffer.append(temp);
temp = (Character)stack.pop();
};
}else{ //四个运算符时,
while(!shouldPush(c,stack)){
buffer.append((Character)stack.pop());
}
stack.push(c);
}
}
}
while(!stack.isEmpty()){
buffer.append((Character)stack.pop());
}
TokenParser parser = new TokenParser();
return parser.parse(buffer.toString());
}
/*
* 比较该运算符与临时栈栈顶指针的运算符的优先级,如果临时栈栈顶指针的优先级大于等于该运算符的优先级,
* 弹出并添加到后缀表达式中,反复执行前面的比较工作,直到遇到一个栈顶指针的优先级低于该运算符的优先级,
* 停止弹出添加并把该运算符压入栈中。
* 此时的比较过程如果出现栈顶的指针为‘(’,则停止循环并把该运算符压入栈中
*
*/
private static boolean shouldPush(char c,Stack stack){
if(stack.isEmpty()){
return true;
}
char peek = (Character)stack.peek();
if(peek == '('){
return true;
}
if((c == '*' || c == '/') && (peek == '+' || peek == '-')){
return true;
}
return false;
}
}