C++中缀表达式生成后缀表达式(主要思想)

文章目录

    • 1.后缀表达式是什么
    • 2.后缀表达式有什么作用
    • 3.算法实现
    • 4.计算方法
    • 5.代码

1.后缀表达式是什么

后缀表达式也称逆波兰式(将运算符写在操作数之后)
如:我们平时写a+b,这是中缀表达式,写成后缀表达式就是:ab+
(a+b)c-(a+b)/e的后缀表达式为:
(a+b)c-(a+b)/e
→((a+b)c)((a+b)/e)-
→((a+b)c
)((a+b)e/)-
→(ab+c
)(ab+e/)-
→ab+c
ab+e/-

2.后缀表达式有什么作用

实现逆波兰式的算法,难度并不大,但为什么要将看似简单的中序表达式转换为复杂的逆波兰式?原因就在于这个简单是相对人类的思维结构来说的,对计算机而言中序表达式是非常复杂的结构。相对的,逆波兰式在计算机看来却是比较简单易懂的结构。因为计算机普遍采用的内存结构是栈式结构,它执行先进后出的顺序

3.算法实现

1.首先需要一个队列存放操作数,一个栈临时存放运算符
2.从中缀式的左端开始取字符,若字符为操作数,直接压入队列;
3.若取出的字符为运算符,若此时栈为空则放入栈中,若栈不为空,和栈顶的元素比较优先级。若字符优先级大于栈顶元素则入栈,否则不断弹出栈顶元素压入队列,直到栈顶元素优先级低于取出的字符。
4.取出表达式所有字符后将栈里的元素全部弹出,依次压入队列。
完成以上步骤队列弹出队列就是原表达式的逆波兰式。

4.计算方法

1.声明一个栈临时存放操作数。依次弹出队列,若弹出元素为操作数,直接入栈。
2.若弹出元素为操作符则将栈中元素弹出按照运算符运算。再将运算结果入栈。
3.循环操作,队列中元素全部弹出后即可得到计算结果。

5.代码

#include 
#include 
#include 
using namespace std;

//自定义判断优先级
bool isSuperior(string s,stack<string>t)
{
}

int main()
{
    stack<string> s;
    queue<string> q;
    string str,t;
    getline(cin,str);
    for(int i = 0;i < str.size();i++)
    {
        //循环目标表达式
        if(str[i] == " " || i == str.size()-1)
        {
            //若取出元素为操作数
            if(t == "操作数")
                q.push(t);
                //若取出元素为运算符
            else{
                    //当栈不为空且栈顶元素优先级大于取出元素
                while(!s.empty() && !isSuperior(t,s))
                {
                    q.push(s.top());
                    s.pop();
                }
                s.push(t);
            }
        }
        //遍历结束后将栈里元素依次弹出入列
        while(!s.empty())
        {
            q.push(s.top());
            s.pop();
        }
        //到此逆波兰式完成。
        //计算逆波兰式结果
        stack<string> s1;
        //弹出队列元素
        while(!q.empty())
        {
            if(q.front() == "操作数")
            {
                s1.push(q.front());
                q.pop();
            }else{
                //弹出元素做运算
                string t1 = s1.top();
                s1.pop();
                string t2 = s1.top();
                s1.pop();
                s1.push(t1 + t2);
            }
        }
        //循环结束后s1的栈顶元素即为运算结果
    }
    return 0;
}

后缀表达式可以有很多形式,不只是普通的数值运算等等。以上代码只是举例说明,没有运行过,如有错误欢迎指出。

你可能感兴趣的:(算法)