后缀表达式计算

坑。。。

若是浮点运算,避免代码中直接与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;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值