14_计算机核心解析算法(下)

声明:此文章仅是本人在学习狄泰QT实验分析课程所做的笔记,文章中包含狄泰软件资料内容,一切版权归狄泰软件所有!
实验环境:ubuntu10 + Qt Creator2.4.1 + Qt SDK 4.7.4

1. 后缀表达式计算

后缀表达式计算思想
遍历后缀表达式中的数字运算符

  • 当前元素为数字:进栈
  • 当前元素为运算符
    1) 从栈中弹出右操作数
    2) 从栈中弹出左操作数
    3) 根据符号进行运算
    4)将运算结果压入栈中
  • 遍历结束:栈中的唯一数字为运算结果

后缀表达式计算伪代码

14_计算机核心解析算法(下)_第1张图片

后缀表达式计算注意事项

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

编程说明:后缀表达式计算算法

QString QCalculatorDec::calculate(QString l, QString op, QString r)
{
    QString ret = "Error";

    if(isNumber(l) && isNumber(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 == "/")
        {
            const double P = 0.000000000000001;
            if( ( -P < rp )&&( rp < P ) )
            {
              ret = "Error";
            }
            else
            {
              ret.sprintf("%f", lp / rp);
            }
        }
    }

    return ret;
}

QString QCalculatorDec::calculate(QQueue exp)
{
    QString ret = "Error";
    QStack stack;

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

        if( isNumber(e) )
        {
            stack.push(e);
        }
        else if(isOperator(e))
        {
            if( !stack.isEmpty() )
            {
                QString rp = stack.pop();
                QString lp = 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;
}

2. 小结

  • 计算方法由3个不同的子算法构成
  • Qt项目在整体上采用面向对象分析与设计
  • 局部的算法设计依旧采用面向过程的方法完成
  • Qt开发是各种开发技术的综合运用

你可能感兴趣的:(14_计算机核心解析算法(下))