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

本文介绍了一种将标准算术表达式转换为逆波兰表达式的方法。通过使用栈来跟踪运算符的优先级,该算法可以正确处理括号、加减乘除运算,并确保输出的逆波兰表达式遵循正确的计算顺序。

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

解答精髓在于将(),+-,*/,数字分级,级别递增,从左到右遍历表达式,将每一个字符变量与栈顶变量作比较,级别高的出栈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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值