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

1.后缀表达式
(1)人类习惯的数学表达式叫做中缀表达式
(2)另外,还有一种将运算符放在数字后面的后缀表达式(消除了中缀表达式中的括号)
(3)实例:
在这里插入图片描述

2.中缀or后缀
中缀表达式符合人类的阅读和思维习惯
后缀表达式符合计算机的运算方式
消除了中缀表达式中的括号
同时保留中缀表达式中的运算优先级

3.计算器核心算法
解决方案:
(1)将中缀表达式进行数字和运算符的分离
(2)将中缀表达式转换后缀表达式
(3)通过后缀表达式计算最终结果

4.分离算法分析
在这里插入图片描述思想:以符号作为标志对表达式中的字符逐个访问
定义累计变量字符串num
当前字符exp[i]为数字或小数点时:
累计:num += exp[i];
当前字符exp[i]为符号时:
num为运算数,分离并保存
若exp[i]为正负号:
累计符号位+和-:num += exp[i]
若exp[i]为运算符:
分离并保存
在这里插入图片描述如何区分正负号与加号和减号?
+和-在表达式的第一个位置
括号后的+和-
运算符后的+和-
+9 + (-3 - -1) * -5

小结:
QString中的每个字符为QChar
四则运算表达式的计算分三个步骤:
数字和符号分离
中缀表达式转后缀表达式
根据后缀表达式计算结果

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

2.转换过程:
当前元素e为数字:输出
当前元素e为运算符:
1.与栈顶运算符进行优先级比较
2.小于等于:将栈顶元素输出,转1
3.大于:将当前元素e入栈
当前元素e为左括号:入栈
当前元素e为有括号:
1.弹出栈顶元素并输出,直至栈顶元素为左括号
2.将栈顶的左括号从栈中弹出
在这里插入图片描述关键点:转换过程中左右括号是重要标志
如何确保表达式中的括号能够左右匹配?

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

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

计算器核心解析算法(下)
1.编缀表达式计算
遍历后缀表达式中的数字和运算符
当前元素为数字:进栈
当前元素为运算符:
1.从栈中弹出右操作数
2.从栈中弹出左操作数
3.根据运算符进行运算
4.将运算结果压入栈中
遍历结束
栈中的唯一数字为运算结果
在这里插入图片描述
注意:
1.与数学计算相关的算法都需要考虑除0的情况
2.若是浮点运算,避免代码中直接与0做相等比较

用户界面和业务逻辑分离

基本程序架构一般包含:
用户界面模块(UI)
接受用户输入及呈现数据
业务逻辑模块(Business Logic)
根据用户需求处理数据

用户界面与业务逻辑如何交互?

基本设计原则:
1.功能模块之间需要进行解耦
2.核心思想:强内聚,弱耦合
每个模块应该实现单一的功能
模块内部的子模块只为整体的单一功能而存在
模块之间通过约定好的接口进行交互

接口:
面向过程:接口是一组预定义的函数类型
面向对象:接口是纯虚类

模块之间仅通过接口进行关联
必然存在模块会使用接口
必然存在模块实现对应的接口
模块间的练习是单向依赖的
避免模块间存在循环依赖的情况
循环依赖是糟糕设计的标准之一

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐