LINTCODE——表达式求值

来源:互联网 发布:svip名片ps源码 编辑:程序博客网 时间:2024/06/16 06:28

LINTCODE——表达式求值

前期准备:
首先我们得要了解前缀、中缀、后缀表示式分别是什么,然后计算方法是什么
举例:
(3 + 4) × 5 - 6 就是中缀表达式
- × + 3 4 5 6 前缀表达式
3 4 + 5 × 6 - 后缀表达式
说简单点就是运算符的位置,在前的话就是前缀,以此类推;
详细了解请点击:

http://blog.csdn.net/antineutrino/article/details/6763722/

对于计算机来说,中缀表达式是相当复杂的,所以我们为了他简化问题,那么就可以理解为,这套题目考的就是由中缀表达式转换成前缀或者后缀表达式求值,话不多说,直接上代码。

我把中缀转前缀和后缀的代码都写了,不过最后计算使用前缀表达式计算的,感兴趣的自己算后缀表达式的值;

class Solution {public:    /*     * @param expression: a list of strings     * @return: an integer     */    int evaluateExpression(vector<string> &expression) {        // write your code here        //将中缀变为前缀;        vector<string> sbegin,send;        sbegin = beginE(expression);        //将中缀变为后缀        send = endE(expression);        //计算前缀表达式        stack<int> res;        for(auto x : sbegin)        {            if(cmp(x) == 0)                res.push(stoi(x));            else            {                int temp1 = res.top();                res.pop();                int temp2 = res.top();                res.pop();                int temp = acl(temp1,x,temp2);                res.push(temp);            }        }        return res.empty()? 0 : res.top();    }   vector<string> beginE(vector<string> &stemp)    {        stack<string> s;        vector<string> sbegin;        int n = stemp.size();        for(int i = n-1; i >= 0; i--)        {            if(cmp(stemp[i]) == 0)                sbegin.push_back(stemp[i]);            else if(stemp[i] == "(")            {                //将s压入sbegin                while(s.top() != ")")                {                    sbegin.push_back(s.top());                    s.pop();                }                s.pop();            }            else            {                bool flag = true;                while(flag){                    if(s.empty() || stemp[i] == ")" || s.top() == ")" || (cmp(stemp[i]) >= cmp(s.top())) )                    {                        s.push(stemp[i]);                        flag = false;                    }                    else                    {                        sbegin.push_back(s.top());                        s.pop();                    }                }            }        }        while(!s.empty())        {            sbegin.push_back(s.top());            s.pop();        }        return sbegin;    }    vector<string> endE(vector<string> &stemp)    {        stack<string> s;        vector<string> send;        int n = stemp.size();        for(int i = 0; i < n; i++)        {            if(cmp(stemp[i]) == 0)                send.push_back(stemp[i]);            else if(stemp[i] == ")")            {                //将s压入sbegin                while(s.top() != "(")                {                    send.push_back(s.top());                    s.pop();                }                s.pop();            }            else            {                bool flag = true;                while(flag){                    if(s.empty() || stemp[i] == "(" || s.top() == "(" || (cmp(stemp[i]) > cmp(s.top())) )                    {                        s.push(stemp[i]);                        flag = false;                    }                    else                    {                        send.push_back(s.top());                        s.pop();                    }                }            }        }        return send;    }    int cmp(string a)    {        switch (a[0]){            case '+' :                 return 1;            case '-':                return 1;            case '*':                return 2;            case '/':                return 2;            case '(':                return 3;            case ')':                return 3;            default:                return 0;        }    }    int acl(int a , string x, int b)    {        switch (x[0]){            case '+':                return a+b;            case '-':                return a-b;            case '*':                return a*b;            case '/':                return a/b;            default:                return 0;        }    }};
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小狗被车压了一下拉血怎么办 有鬼给你磕头让你不好怎么办 腿又粗又短怎么办 腿又短又粗怎么办 因跑步小腿变粗怎么办 健身后小腿变粗怎么办 打非洲鼓打的手疼怎么办 无塔供水压力小怎么办 家用增压水塔压力不稳定怎么办 蝴蝶耳堵比较紧怎么办 跑步机踏板坏了怎么办 遥控器电池没电了怎么办 空调遥控器电池没电了怎么办 想要自慰家里没有情趣用品怎么办 对政协提案的答复有意见怎么办 邻居在自建房养殖鳖怎么办 江桥全民健身卡怎么办 南翔全民健身卡怎么办 椭圆机皮带断了怎么办 不小心扭腰了怎么办 扭腰之后腿疼怎么办 扭腰怎么办吃什么补 湖州奥体中心怎么办卡 学车把教练投诉了怎么办 白球鞋鞋边发黄怎么办 公务员体检时心跳过快怎么办 老人心脏跳得慢怎么办 银行月限额10万怎么办 跑步后迎面骨疼怎么办 跑步时迎面骨疼怎么办 爬了楼梯小腿疼怎么办 走路走太多小腿酸痛怎么办 微信转账月限额怎么办 运动后小腿骨疼怎么办 用单杠练腹肌晃怎么办 一跑步小腿就紧怎么办 小腿一跑步就痛怎么办 单杠屈臂悬垂身体摆动怎么办 脸上被打了紫了怎么办 王者荣耀队友太坑怎么办 大脸不想戴泳帽怎么办