14-计算器核心解析算法(下)

1. 后缀表达式计算

计算后缀表达式步骤:

-遍历后缀表达式中的数字和运算符
	当前元素为数字:进栈
	当啊前元素为运算符
		1.从栈中弹出右操作数
		2.从栈中弹出左操作数
		3.根据符号进行运算
		4.将运算结果压入栈中
-遍历结束
	栈中的唯一数字为运算结果

注意点:

  • 与数学计算相关的算法都需要考虑除 0 的情况
  • 若是浮点运算,避免代码中直接与 0 做相等比较
const double p = 0.0000000000000001;
if((-p < r)&& (r < p))
{
    ret = "Error";
}
else
{
    ret.printf("%f",l/r);
}

2. 计算后缀表达式示例

部分核心代码示例:

// 函数功能,计算基本表达式 【辅助函数】
QString calculate(QString l, QString op, QString r)
{
    QString ret = "Error";

    if( isNumber(l) && isNumber(r) )  // 判断 l 和 r 是否是数字
    {
        double lp = l.toDouble();
        double rp = r.toDouble();

        if( op == "+" )
        {
            ret.sprintf("%f", lp + rp);
        }
        else if( op == "-" )
        {
            ret.sprintf("%f", lp - rp);
        }
        else if( op == "*" )
        {
            ret.sprintf("%f", lp * rp);
        }
        else if( op == "/" )  // 除法需要特殊处理,除0判断
        {
            const double P = 0.000000000000001;

            if( (-P < rp) && (rp < P) )
            {
                ret = "Error";
            }
            else
            {
                ret.sprintf("%f", lp / rp);
            }

        }
        else
        {
            ret = "Error";
        }
    }

    return ret;
}
QString calculate(QQueue<QString>& exp)
{
    QString ret = "Error";
    QStack<QString> stack;

    while( !exp.isEmpty() )
    {
        QString e = exp.dequeue();

        if( isNumber(e) )
        {
            stack.push(e);
        }
        else if( isOperator(e) )
        {
            QString rp = !stack.isEmpty() ? stack.pop() : "";
            QString lp = !stack.isEmpty() ? stack.pop() : "";
            QString result = calculate(lp, e, rp);

            if( result != "Error" )
            {
                stack.push(result);
            }
            else
            {
                break;
            }
        }
        else
        {
            break;
        }
    }

    if( exp.isEmpty() && (stack.size() == 1) && isNumber(stack.top()) )
    {
        ret = stack.pop();
    }

    return ret;
}

3. 总结

  • 计算方法由3个不同的子算法构成
  • QT 项目在整体上采用面向对象分析与设计
  • 局部的算法设计依旧采用面向过程的方法完成
  • QT 开发是各种开发技术的综合运用
发布了61 篇原创文章 · 获赞 31 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_40794602/article/details/105585967
今日推荐