
QString QCalculatorDec::calculate(QString l, QString op, QString r)
{
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 == "/")
{
double delta = 0.000000000001;
if(-delta < rp && rp < delta)
{
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;
stack.clear();
while(!exp.isEmpty())
{
QString str = exp.dequeue();
if(isNumber(str))
{
stack.push(str);
}
else if(isOperator(str))
{
QString rp = !stack.isEmpty() ? stack.pop() : "";
QString lp = !stack.isEmpty() ? stack.pop() : "";
QString result = calculate(lp, str, rp);
if(result != "Error")
{
stack.push(result);
}
else
{
break;
}
}
}
if(exp.isEmpty() && stack.size() == 1 && isNumber(stack.top()))
{
ret = stack.pop();
}
return ret;
}