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

1. 后缀表达式

  • 认类习惯的数学表达式叫做中缀表达式
  • 后缀表达式是一种将运算符放在数字后面的表达式

在这里插入图片描述

  • 后缀表达式符合计算机的运算方式,后缀表达式消除了中缀表达式中的括号,同时保留中缀表达式中的运算优先级

2. 计算器核心算法

2.1 解决方案

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

2.2 分离算法

QQueue<QString> 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;
}

代码走读;

  • 第 9 行判断是否是小数点或者数字
  • 第14 行判断是否是一个符号
  • 第 23 行判断是否为整数负数
  • 第 36 行将最后的数字加入到队列中

难点分析:

满足正负号的条件:
	+ 和 - 在表达式第一个位置
	括号后的 + 或者 -
	运算符后的 + 或者 -

3. 总结

  • QString 中的每个字符为 QChar
  • QT 中提供了开发中不可或缺的数据结构类
  • 四则运算表达式的计算分三个步骤,数字和符号分离;中缀表达式转后缀表达式;根据后缀表达式计算结果 ( 目前只完成了第一个步骤 )
发布了61 篇原创文章 · 获赞 31 · 访问量 10万+

猜你喜欢

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