美文网首页
中缀转后缀表达式与后缀求值

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

作者: HelloSam | 来源:发表于2020-03-14 10:45 被阅读0次
    #include<iostream>
    #include <stack>
    #include <string>
    using namespace std;
    void post_value(string str2);
    int op(int a, int b, char ch)
    {
        if (ch == '+') return a + b;
        if (ch == '-') return a - b;
        if (ch == '*') return a * b;
        if (ch == '/') return a / b;
    }
    
    //运算符
    struct opChar 
    {   
        char ch; // 该结构体代表的运算符
        int out; //该运算符的栈外优先级
        int in; //该运算符的栈内优先级
    
        opChar(char ch, int out, int in)
        {
            this->ch = ch;
            this->out = out;
            this->in = in;
        }
    };
    
    int main()
    {
        opChar plus('+',2,3);
        opChar sub('-',2,3);
        opChar mul('*',4,5);
        opChar div('/',4,5);
        opChar end('#',0,0);
        opChar left('(',8,1);
        opChar right(')',1,-1);
    
        string str;//输入一个中缀表达式
        cin >> str;
    
        string str2 = "";//把输出结果放到后缀表达式中去,然后对后缀表达式进行后缀表达式求值
        stack<opChar> sp;
        sp.push(end); // 让'#'来垫底
    
        for (int i = 0; i < str.size(); i++)
        {
            if (str[i] >= 48 && str[i] <= 57)//是操作数,就直接放到后缀表达式字符串里面去
            {
                str2.push_back(str[i]);
            }
            else
            {
                if (str[i]==plus.ch) //如果扫描到的是加号,用扫描到的加号的栈外优先级和栈顶运算符的栈内优先级做比较,如果比之大
                {
                    while (!sp.empty())
                    {
                        if (plus.out > sp.top().in)
                        {
                            sp.push(plus);
                            break;
                        }
                        else
                        {
                            str2.push_back(sp.top().ch);
                            sp.pop();
                        }
                    }
    
                } 
                if (str[i] == sub.ch)
                {
                    while (!sp.empty())
                    {
                        if (sub.out > sp.top().in)
                        {
                            sp.push(sub);
                            break;
                        }
                        else
                        {
                            str2.push_back(sp.top().ch);
                            sp.pop();
                        }
                    }
    
                }
                if (str[i] == mul.ch) 
                {
                    while (!sp.empty())
                    {
                        if (mul.out > sp.top().in)
                        {
                            sp.push(mul);
                            break;
                        }
                        else
                        {
                            str2.push_back(sp.top().ch);
                            sp.pop();
                        }
                    }
    
                }
    
                if (str[i] == div.ch)
                {
                    while (!sp.empty())
                    {
                        if (div.out > sp.top().in)
                        {
                            sp.push(div);
                            break;
                        }
                        else //如果/比栈顶元素的优先级小,就弹出栈顶元素,直到/比栈顶要大
                        {
                            str2.push_back(sp.top().ch);
                            sp.pop();
                        }
                    }
    
                }
    
                if (str[i] == left.ch) //如果扫描到左括号,直接入栈
                {
                    sp.push(left);
                }
    
                if (str[i] == right.ch) //如果是右括号
                {
                    while (!sp.empty())//只要栈不空
                    {
                        //就消去括号
                        if (right.out == sp.top().in)
                        {
                            sp.pop();
                            break;
                        }
                        else//如果右括号比栈顶的优先级小,就出栈,直到其相等
                        {
                            str2.push_back(sp.top().ch);
                            sp.pop();
                        }
                    }
    
                }
            }
        }
        //把栈里面剩下的运算符弹出来
        while (sp.top().ch!='#')
        {
            str2.push_back(sp.top().ch);
            sp.pop();
        }
    
        //cout << str2 << endl; 得到了后缀表达式
    
        //然后后缀表达式求值
        post_value(str2);
    
        return 0; 
    }
    
    void post_value(string str)
    {
        stack<char> vc;
        int ret;
        for (int i = 0; i < str.size(); i++)
        {
            if (str[i] >= 48 && str[i] <= 57)//是数字
            {
                vc.push(str[i]);
            }
            else
            {
                int tempa = vc.top() - '0'; vc.pop();
                int tempb = vc.top() - '0'; vc.pop();
                ret = op(tempa, tempb, str[i]);
                vc.push(ret + '0');
            }
    
        }
        cout << vc.top() - '0' << endl;
    }
    

    相关文章

      网友评论

          本文标题:中缀转后缀表达式与后缀求值

          本文链接:https://www.haomeiwen.com/subject/lepmshtx.html