计算器核心算法——中缀表达式转为后缀表达式

Posted -glb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算器核心算法——中缀表达式转为后缀表达式相关的知识,希望对你有一定的参考价值。

中缀表达式转后缀表达式的过程类似编译过程
——四则运算表达式中的括号必须匹配
——根据运算符优先级进行转换
——转换后的表达式中没有括号
——转换后可以顺序的计算出最终结果

这是某位伟人研究出的算法,在这里我们直接拿来用就可以。

转换过程:
——当前元素e为数字:输出
——当前元素e为运算符:
1.与栈顶运算符进行优先级比较
2.小于等于:将栈顶元素输出,转1
3.大于:将当前元素e入栈

——当前元素e为左括号:入栈
——当前元素e为右括号:
1.弹出栈顶元素并输出,直至栈顶元素为左括号
2.将栈顶的左括号从栈中弹出

while( !exp.isEmpty() )
{
    QString s = exp.dequeue();
    
    if(isNumber(e))
        输出e;
    else if(isOperator(e))
    {
        while( priority(e) <= priority(stack.top() ))
            输出栈顶元素: stack.pop();
            
        stack.push(e);
    }
    else if(isLeft(e))
        stack.push(e);
    else if(isRight(e))
    {
        while( !isLeft(stack.top() ))
            输出栈顶元素 stack.pop();
            
        从栈中弹出左括号: stack.pop();
    }
}

exp是上篇博客中用分离算法得到的队列了,将里面的每个元算都处理,也就是说一直处理到这个队列为空为止。

关键点:转换过程中左右括号是重要标志
——如何确保表达式中的括号能够左右匹配?

合法的四则运算表达式
——括号匹配成对出现
——左括号必然先于右括号出现

for(int i=0; i<len; i++)
{
    if(exp[i]为左括号)
        exp[i]入栈;
    else if(exp[i]为右括号)
    {
        if(栈顶元素为左括号)
            将栈顶元素弹出;
        else    
            匹配错误
    }
}

 

以上是关于计算器核心算法——中缀表达式转为后缀表达式的主要内容,如果未能解决你的问题,请参考以下文章

中缀表达式转为后缀表达式(逆波兰式)求值

中缀表达式转为后缀表达式(逆波兰式)求值

计算器核心解析算法(上)

shunting-yard 调度场算法中缀表达式转逆波兰表达式

JavaScript实现计算后缀表达式(逆波兰表达式)以及将中缀表达式转为后缀表达式

第十三课计算器核心解析算法(中)