题目描述:
将表达式处理成逆波兰表达式,主要处理的就是优先级问题,将括号去掉,用操作符的先后顺序表示运算顺序。
逆波兰表达式中操作数的顺序和原表达式中操作数的顺序是一样的,也就是说在原表达式遍历过程中,如果判断是操作数,直接放入结果中。重点是操作符的放入顺序,这个是决定运算顺序的关键。
操作符一共有 ( + - * / ) 六种, 遍历到的操作符和当前栈顶操作符进行比较。当遍历到的操作符比栈顶的操作符优先级低或者相同时,弹栈; 当前操作符比栈顶的操作符优先级高时,当前操作符入栈。
i 遍历到 (, 直接入栈
ii 遍历到 + -, 弹栈,加入到结果中,直到遇到 (,将当前操作符压入栈中.
iii 遍历到 * /,如果栈顶是 * 或者 / , 弹栈,加入到结果,直到栈顶不是这两个操作符,将当前操作符压入栈中.
iV 遍历到 ), 弹栈,加入结果,直到遇到 ( , 然后把(弹出,不加入结果中。
原表达式遍历结束,将栈中的所有操作符依次弹出,加入到结果中,即为最终结果。
代码:
vector<string> convertToRPN(vector<string> &expression) {
// write your code here
vector<string> res;
stack<string> s;
for(int i=0; i<expression.size(); ++i){
if(expression[i] == "("){ //遇到左括号直接入栈
s.push("(");
}
else if(expression[i] == "+" || expression[i] == "-"){
while(!s.empty() && s.top() != "("){
res.push_back(s.top());
s.pop();
}
s.push(expression[i]);
}
else if(expression[i] == "*" || expression[i] == "/"){
while(!s.empty() && (s.top()=="*" || s.top()=="/")){
res.push_back(s.top());
s.pop();
}
s.push(expression[i]);
}
else if(expression[i] == ")"){
while(!s.empty() && s.top() != "("){
res.push_back(s.top());
s.pop();
}
s.pop();
}
else{
res.push_back(expression[i]);
}
}
while(!s.empty()){
res.push_back(s.top());
s.pop();
}
return res;
}