LintCode 将表达式转换为逆波兰式

看懂将表达式转换为逆波兰式的原理,写不好程序。
我是看大话数据结构,转换规则是:遍历中,若是数字,则输出,成为逆波兰表达式;若是符号,则与栈顶符号比优先级。

解答精髓在于将(),+-,*/,数字分级,级别递增,从左到右遍历表达式,将每一个字符变量与栈顶变量作比较,级别高的出栈1,进入栈2。(栈1:比较优先级 栈2:逆波兰表达式)

LintCode 将表达式转换为逆波兰式_第1张图片

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;istring 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;
    }

你可能感兴趣的:(数据结构,LintCode)