1. 后缀表达式
- 认类习惯的数学表达式叫做中缀表达式
- 后缀表达式是一种将运算符放在数字后面的表达式
- 后缀表达式符合计算机的运算方式,后缀表达式消除了中缀表达式中的括号,同时保留中缀表达式中的运算优先级
2. 计算器核心算法
2.1 解决方案
- 将中缀表达式进行数字和运算符的分离
- 将中追表达式转换为后缀表达式
- 通过后缀表达式计算最终结果
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 中提供了开发中不可或缺的数据结构类
- 四则运算表达式的计算分三个步骤,数字和符号分离;中缀表达式转后缀表达式;根据后缀表达式计算结果 ( 目前只完成了第一个步骤 )