看懂将表达式转换为逆波兰式的原理,写不好程序。
我是看大话数据结构,转换规则是:遍历中,若是数字,则输出,成为逆波兰表达式;若是符号,则与栈顶符号比优先级。
解答精髓在于将(),+-,*/,数字分级,级别递增,从左到右遍历表达式,将每一个字符变量与栈顶变量作比较,级别高的出栈1,进入栈2。(栈1:比较优先级 栈2:逆波兰表达式)
int getLevel(string obj)
{
if(obj == "(" )
return 0;
if(obj == "+" || obj == "-" )
return 1;
if(obj == "*" || obj == "/" )
return 2;
return 3; //数字级别最高
}
vector<string> convertToRPN(vector<string> &expression) {
// write your code here
stack<string> st;
vector<string> RPN;
for(int i=0;i<expression.size();i++)
{
string item=expression[i];
if(item == "(" )
st.push(item);
else if(item == ")" )
{
while(st.top() != "(" )
{
RPN.push_back(st.top());
st.pop();
}
st.pop();
}
else
{
while(!st.empty() && getLevel(item) <= getLevel(st.top()))
{
RPN.push_back(st.top());
st.pop();
}
st.push(item);
}
}
while(! st.empty())
{
RPN.push_back(st.top());
st.pop();
}
return RPN;
}
本文介绍了一种将标准算术表达式转换为逆波兰表达式的方法。通过使用栈来跟踪运算符的优先级,该算法可以正确处理括号、加减乘除运算,并确保输出的逆波兰表达式遵循正确的计算顺序。

2578

被折叠的 条评论
为什么被折叠?



