给定一个表达式字符串数组,返回该表达式的逆波兰表达式(即去掉括号)
样例
对于 [3 - 4 + 5]
的表达式(该表达式可表示为["3", "-", "4", "+", "5"]),返回[3 4 - 5 +]
(该表达式可表示为 ["3", "4", "-", "5", "+"])。
看注释
class Solution {
/**
* @param expression: A string array
* @return: The Reverse Polish notation of this expression
*/
public ArrayList<String> convertToRPN(String[] expression) {
// write your code here
ArrayList<String> R = new ArrayList<String>();//如果传入的表达式的长度为0或1直接返回
if(expression.length==0)
return R;
else if(expression.length==1){
R.add(expression[0]);
return R;
}
Stack<String> tokens = new Stack<String>();//用栈存储符号
String now = null;
for(int i=0;i<expression.length;++i){
now = expression[i];
if(now.matches("[-]?\\d+")){//如果为数字,直接计入
R.add(now);
}else if(tokens.empty()){
/*
*对于符号,若当前的符号的优先级比栈顶的符号高或栈为空,压入栈中。否则把栈中符号弹出,直至当前的符号的优先级比栈顶的符号高或者栈为空
*在压入栈中
*/
tokens.push(now);
}else if(now.equals("+")||now.equals("-")){
while(!tokens.empty()&&(!tokens.peek().equals("("))){
R.add(tokens.pop());
}
tokens.push(now);
}else if(now.equals("*")||now.equals("/")){
while(!tokens.empty()&&
(tokens.peek().equals("*")||tokens.peek().equals("/"))){
R.add(tokens.pop());
}
tokens.push(now);
}else if(now.equals("(")){
tokens.push(now);
}else if(now.equals(")")){
while(!tokens.empty()&&(!tokens.peek().equals("("))){
R.add(tokens.pop());
}
tokens.pop();
}
}
while(!tokens.empty())
R.add(tokens.pop());
return R;
}
}