文章目录
1. 后缀表达式计算
计算后缀表达式步骤:
-遍历后缀表达式中的数字和运算符
当前元素为数字:进栈
当啊前元素为运算符
1.从栈中弹出右操作数
2.从栈中弹出左操作数
3.根据符号进行运算
4.将运算结果压入栈中
-遍历结束
栈中的唯一数字为运算结果
注意点:
- 与数学计算相关的算法都需要考虑除 0 的情况
- 若是浮点运算,避免代码中直接与 0 做相等比较
const double p = 0.0000000000000001;
if((-p < r)&& (r < p))
{
ret = "Error";
}
else
{
ret.printf("%f",l/r);
}
2. 计算后缀表达式示例
部分核心代码示例:
// 函数功能,计算基本表达式 【辅助函数】
QString calculate(QString l, QString op, QString r)
{
QString ret = "Error";
if( isNumber(l) && isNumber(r) ) // 判断 l 和 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 == "/" ) // 除法需要特殊处理,除0判断
{
const double P = 0.000000000000001;
if( (-P < rp) && (rp < P) )
{
ret = "Error";
}
else
{
ret.sprintf("%f", lp / rp);
}
}
else
{
ret = "Error";
}
}
return ret;
}
QString calculate(QQueue<QString>& exp)
{
QString ret = "Error";
QStack<QString> stack;
while( !exp.isEmpty() )
{
QString e = exp.dequeue();
if( isNumber(e) )
{
stack.push(e);
}
else if( isOperator(e) )
{
QString rp = !stack.isEmpty() ? stack.pop() : "";
QString lp = !stack.isEmpty() ? 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;
}
3. 总结
- 计算方法由3个不同的子算法构成
- QT 项目在整体上采用面向对象分析与设计
- 局部的算法设计依旧采用面向过程的方法完成
- QT 开发是各种开发技术的综合运用