坑。。。
若是浮点运算,避免代码中直接与0做相等比较;因为浮点数不精确,做大小比较即可。
错误:'isNumber' was not declared in this scope
修改:加上 。。。类作用域
QString QCalculatorDec::calculate(QQueue<QString>& exp){}
QString QCalculatorDec::calculate(QString l, QString op, QString r) //3.根据符号进行运算 -->有必要再添加一个函数
{
QString ret ="Error";
if( isNumber(l) && isNumber(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 QCalculatorDec::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() : ""; //1.从栈中弹出右操作数;
QString lp = !stack.isEmpty() ? stack.pop() : ""; //2.从栈中弹出左操作数;
QString result = calculate(lp,e,rp); //3.根据符号进行运算 -->有必要再添加一个函数;
if( result != "Error" ) //4.将运算结果压入栈中
{
stack.push(result); //计算结果正确,返回
}
else
{
break;
}
}
}
if( exp.isEmpty() && (stack.size() == 1) && isNumber(stack.top()) ) //条件:1.后缀表达式被遍历完成,2.栈中只存在唯一的元素,3.且唯一的栈顶元素为数字
{
ret = stack.pop();
}
return ret;
}