遍历后缀表达式中的数字和运算符
当前元素为数字:进栈
当前元素为运算符:
1.从栈中弹出右操作数
2.从栈中弹出左操作数
3.根据符号进行运算
4.将运算结果压入栈中
结束遍历
伪代码
while (!exp.isEmpty()) {
if (当前元素为数字) {
入栈;
}
else if (当前元素为运算符) {
1.从栈中弹出右操作数;
2.从栈中弹出左操作数;
3.根据符号进行运算;
4.将运算结果压入栈中;
}
else {
表达式错误;
}
}
const double P = 0.00000000000000001;
if ((-P < r) && (r < P)) {
ret = "Error";
}
else {
ret.sprintf("%f", l/r);
}
QString QCalculatorDec::calculate(QQueue<QString> &exp)
{
QString ret = "Error";
QStack<QString> s;
while (!exp.isEmpty()) {
QString e = exp.dequeue();
if (isNumber(e)) {
s.push(e);
}
else if (isOperator(e)) {
QString right = !s.isEmpty() ? s.pop() : "";
QString left = !s.isEmpty() ? s.pop() : "";
QString result = calculate(left, e, right);
if (result != "Error") {
s.push(result);
}
else {
break;
}
}
else {
break;
}
}
if (exp.isEmpty() && s.size() == 1 && isNumber(s.top())) {
ret = s.pop();
}
return ret;
}
QString QCalculatorDec::calculate(const QString &l, const QString &op, const QString &r)
{
QString ret = "Error";
if (isNumber(l) && isNumber(r) && isOperator(op)) {
double ld = l.toDouble();
double rd = r.toDouble();
if (op == "+") {
ret.sprintf("%f", ld + rd);
}
else if (op == "-") {
ret.sprintf("%f", ld - rd);
}
else if (op == "*") {
ret.sprintf("%f", ld * rd);
}
else if (op == "/") {
const double P = 0.00000000000000001;
if ((-P < rd) && (rd < P)) {
ret = "Error";
}
else {
ret.sprintf("%f", ld / rd);
}
}
}
return ret;
}