c++实现将表达式转换为逆波兰表达式
https://github.com/Lanying0/lintcode
所属:
数据结构->线性结构->栈
问题:
给定一个表达式字符串数组,返回该表达式的逆波兰表达式(即去掉括号)。
样例
对于 [3 - 4 + 5]的表达式(该表达式可表示为["3", "-", "4", "+", "5"]),返回 [3 4 - 5 +](该表达式可表示为 ["3", "4", "-", "5", "+"])。
思路:
逆波兰的一般思路,对于输入的字符串,构建两个栈,一个栈中暂存运算符号,另一个栈中存表达式结果。
从头到尾一遍扫描字符串:遇到运算数,则直接压入表达式结果栈;遇到运算符,则要根据运算符优先级分情况处理。
运算符情况:1.左括号:直接压入符号栈。
2.加号、减号,优先级最低,所以要将栈中的加减乘除号先出栈到表达式结果栈,再将加减号入栈。
3.乘号、除号,优先级最高,所以只需将栈中的乘除号出栈到表达式结果栈,再将此次的乘除号入栈。
4.右括号:将栈中左括号之后入栈的运算符全部出栈到表达式结果栈,左括号出栈。
一遍扫描后,若符号栈不为空,则将其全部出栈到表达式结果栈。即为所求。
代码:
class Solution { public: /** * @param expression: A string array * @return: The Reverse Polish notation of this expression */ vector<string> convertToRPN(vector<string> &expression) { // write your code here vector<string>op;//符号栈 vector<string>num;//表达式结果栈 for(int i=0;i<expression.size();i++)//一遍扫描 { if(expression[i]=="+" || expression[i]=="-")//处理加号、减号 { if(op.size()==0) op.push_back(expression[i]); else { while(op.size()!=0 && (op[op.size()-1]=="*" || op[op.size()-1]=="/" ||op[op.size()-1]=="+" || op[op.size()-1]=="-")) { string s=op.back(); op.pop_back(); num.push_back(s); } op.push_back(expression[i]); } if(op[op.size()-1]=="(") { op.push_back(expression[i]); } } else if(expression[i]=="*" || expression[i]=="/")//处理乘号、除号 { if(op.size()==0) op.push_back(expression[i]); else if(op[op.size()-1]=="*" || op[op.size()-1]=="/" ) { string s=op.back(); op.pop_back(); num.push_back(s); op.push_back(expression[i]); } else if(op[op.size()-1]=="+" || op[op.size()-1]=="-") { op.push_back(expression[i]); } else if(op[op.size()-1]=="(") { op.push_back(expression[i]); } } else if(expression[i]=="(")//处理左括号 { op.push_back(expression[i]); } else if(expression[i]==")")//处理右括号 { while(op.back()!="(") { string s=op.back(); op.pop_back(); num.push_back(s); } op.pop_back(); } else//运算数直接压入表达式结果栈 { num.push_back(expression[i]); } } while(op.size()!=0)//符号栈仍有符号时,将其压入表达式结果栈 { string s=op.back(); op.pop_back(); num.push_back(s); } return num; } };
今天的我,是跟昨天不一样的我,是比昨天更好的我~