美文网首页Qt学习
12_计算器核心解析算法(上)

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

作者: 编程半岛 | 来源:发表于2018-01-19 14:14 被阅读12次

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

1. 问题:计算机如何读懂四则运算表达式?

后缀表达式

2. 中缀表达式VS后缀表达式

人类习惯的数学表达式为中缀表达式,另外还有一种将运算符放在数字后面后缀表达式

中缀表达式转换为后缀表达式
  • 中缀表达式符合人类的阅读思维习惯
  • 后缀表达式符合计算机的运行方式
    消除了中缀表达式中的括号
    同时保留了中缀表达式中的运算优先级

3. 计算器核心算法

思路:

  1. 将中缀表达式进行数字和运算符的分离
  2. 将中缀表达式转换为后缀表达式
  3. 通过后缀表达式计算最终结果

4. 分离算法分析

  • 中缀表达式中包含了:数字和小数点[0-9 or .]符号位[+ or -]运算符[+, -, * , /]括号[( or )]

  • 分离算法思想:以符号作为标志对表达式中的字符逐个访问
    (1) 定义累计变量num
    (2) 当前字符exp[i]数字小数点时:
    累计:num += exp[i]
    (3) 当前字符exp[i]符号时:
    num为运算数,分离并保存;
    exp[i]正负号: 累计符号位+和- num += exp[i]
    exp[i]运算符:分离并保存

  • 分离算法伪代码

  • 分离算法难点:如何正确区分正负号加减号
    以下三种情况为正负号
    1)前一个字符为
    2)前一个字符为左括号
    3)前一个字符为操作符

编程说明:计算器中表达式分离算法实现

QQueue<QString> QCalculatorDec::split(const QString& exp)
{
    QQueue<QString> ret;
    QString num = "";
    QString pre = "";

    for(int i=0; i<exp.length(); i++)
    {
        if( isDigitOrDot(exp[i]) )
        {
            num += exp[i];
            pre = exp[i];
        }
        else if( isSymbol(exp[i]))
        {
            if( !num.isEmpty())
            {
                ret.enqueue(num);
                num.clear();
            }

            if( isSign(exp[i]) && ((pre == "") || (pre == "(") || (isOperator(pre))) )
            {
                num += exp[i];
            }
            else
            {
                ret.enqueue(exp[i]);
            }

            pre = exp[i];
        }
    }

    if( !num.isEmpty() )
    {
        ret.enqueue(num);
    }

    return ret;
}

5. 小结

  • QString中的每个字符为QChar
  • Qt中提供了开发中不可或缺的数据结构类
  • 四则运算表达式的计算分三个步骤
    (1) 数字和符号分离
    (2) 中缀表达式转后缀表达式
    (3) 根据后缀表达式计算结果

相关文章

  • 12_计算器核心解析算法(上)

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

  • iOS动画

    CoreAnimation 问题不在动画代码上,在动画算法上 CoreAnimation(超详细解析核心动画)C...

  • 13_计算器核心解析算法(中)

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

  • 学习资料汇总

    GeoHash核心原理解析 GeoHash算法学习讲解、解析及原理分析

  • 第05天(异常、文本文件处理)_03

    11_通过结构体生成json.go 12_通过map生成json.go 13_json解析到结构体.go 14_j...

  • 2022.6.24(晴)

    今天值班。歌咏比赛。12_

  • 12_基本排序算法

    冒泡排序 时间复杂度:O(n^2) 选择排序 时间复杂度:O(n(n-1)/2)找到最小的元素插入迭代的起始位置,...

  • 区块链资源

    书籍: 《区块链项目开发指南》 《区块链核心算法解析》 《区块链:技术驱动金融》 《区块链革命:比特币底层技术如何...

  • 梯度下降解决线性回归,以及自适应学习率设置

    线性回归一般用于预测:比如股票涨停梯度下降是机器学习中最核心的优化算法 函数解析:np.random.normal...

  • 分治算法

    文章结构 如何理解分治算法 分治算法应用举例 1. 如何理解分治算法 1.1 分治算法的核心思想 分治算法的核心思...

网友评论

    本文标题:12_计算器核心解析算法(上)

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