中缀表达式转后缀表达式求值

来源:互联网 发布:kerberos源码 编辑:程序博客网 时间:2024/05/21 08:03

中缀表达式转后缀表达式是数据结构栈和队列很好的应用例子。难点主要就在于如何将中缀表达式转换为后缀表达式的问题上。下面就是转换的规则和需要注意的地方。

首先需要开一个栈和队列。栈用作临时的存储空间。队列则用于存放最终的后缀表达式。

中缀表达式转后缀表达式的规则:

1.开始在栈中压入一个#。然后从中缀表达式的左边开始遍历,如果遇到数字直接放入队列。如果是操作符则和栈顶比较,
如果优先级大于栈顶则入栈,否则将栈顶压入队列并将当前操作符入栈。
2.如果遇到'('。则无条件入栈不用和栈顶进行比较。
3.如果遇到')'。不用入栈,从栈顶开始将栈内元素弹出并压入队列中,直到遇到'('。将'('弹出栈。
后缀表达式运算规则:需要设立一个栈用于存放计算结果。
1.从队列中取元素,如果是操作数直接出队入栈。
2.如果是运算符则出队,并且弹出栈的两个元素运算并将运算结果压入栈内。直到队列为空。

#include <iostream>#include <stack>#include <queue>using namespace std;stack<char>s;queue<char>q;int Operator(char ch){    switch(ch)    {        case '+':        case '-':        case '*':        case '/':        case '(':        case ')':        case '#':            return 1;        default:            return 0;    }}int priority(char ch){    switch(ch)    {        case '+':        case '-':            return 1;        case '*':        case '/':            return 2;        case '#':            return -1;        case '(':            return 0;    }}double caculate(double a,char ch,double b){    switch(ch)    {        case '+':            return a+b;        case '-':            return a-b;        case '*':            return a*b;        case '/':            return a/b;    }   }void change(char *ch){    s.push('#');    int i = 0;    while (ch[i] != '#')    {        if (!Operator(ch[i]))        {            q.push(ch[i]);            i++;        }        else         {            if (ch[i] == '(')            {                s.push(ch[i]);                i++;            }            else if (ch[i] == ')')            {                while (s.top() != '(')                {                    q.push(s.top());                    s.pop();                }                s.pop();                i++;            }            else             {                if (priority(ch[i]) > priority(s.top()))                {                    s.push(ch[i]);                    i++;                }                else                {                    q.push(s.top());                    s.pop();                    s.push(ch[i]);                    i++;                }            }        }    }    /*将剩余的栈内的元素弹出栈存在队列中*/    while (s.top() != '#')    {        q.push(s.top());        s.pop();    }}double result(){    stack<double>s;    while (!q.empty())    {        if (!Operator(q.front()))        {            s.push(q.front()-48);            q.pop();        }        else        {            double b = s.top();            s.pop();            double a = s.top();            s.pop();            char ch = q.front();            s.push(caculate(a,ch,b));            q.pop();        }    }    cout << s.top() << endl;}int main(){    char c[10];    gets(c);    change(c);    result();    system("pause");    return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 户口迁移了医保怎么办 房屋卖了户口怎么办 驾照过期注销了怎么办 负全责不赔偿怎么办 青岛驾驶证过期了怎么办 驾驶证过了年检怎么办 驾驶证审证逾期怎么办 d驾驶证3年没捡怎么办 c1驾驶证3年没审怎么办 驾驶证换证外地怎么办 考驾驶证快到期怎么办 驾照到期人在国外怎么办 驾驶证3年没审怎么办c3 驾驶证几年没审怎么办 驾照体检过期了怎么办 b2驾照超过年检怎么办 驾驶证过审一年怎么办 驾照一年未年审怎么办 b驾照年审过期怎么办 摩托车驾驶证过期一年怎么办 驾驶证过期一年半怎么办 驾照过期了几天怎么办 驾照过期超过一年怎么办 考试驾照过期了怎么办 驾校考试过期了怎么办 驾驶证明过期了怎么办 驾驶证年过期了怎么办 驾照过期六个月怎么办 移动预约号码取消怎么办 身份证换地址驾驶证怎么办 刚来成都怎么办居住证 我在外地怎么办身份证 身份证丢在外地怎么办 换领新身份证时旧证丢了怎么办 二代身份证重号怎么办 北京行驶证到期怎么办 北京驾驶证即将过期怎么办 去澳门没有网络怎么办 三个周期未年检怎么办 深圳驾照丢了怎么办 武汉驾照年审过期怎么办