计算器核心算法:
1、将中缀表达式进行数字和运算符的分离
2、将中缀表达式转换成后缀表达式
3、通过后缀表达式计算最后的结果
三、计算器中缀转后缀算法
计算器中缀转后缀算法的意义在于把中缀表达式转换成后缀表达式,能够更好地计算
- 算法的基本思路
1、如果是isNumber
,直接进输出队列
2、如果是isOperator
,
如果一个运算符优先级 <= 前一个运算符优先级,则这个前面那个运算符进输出队列
其余的全部进栈
3、如果是左括号,进栈
4、如果是右括号,直到栈顶为左括号才不用把栈里的进输出队列,
把栈顶元素pop()
5、其余的报错
如果栈里面不为空,直接全部进队列
bool QCalculatorDec::transform(QQueue<QString>& exp, QQueue<QString>& output)
{
bool ret = match(exp);
output.clear();
QStack<QString> stack;
while(ret && !exp.isEmpty())
{
QString str = exp.dequeue();
if(isNumber(str))
{
output.enqueue(str);
}
else if(isOperator(str))
{
while(!stack.isEmpty() && priority(str) <= priority(stack.top()))
{
output.enqueue(stack.pop());
}
stack.push(str);
}
else if(isLeft(str))
{
stack.push(str);
}
else if(isRight(str))
{
while(!stack.isEmpty() && !isLeft(stack.top()))
{
output.enqueue(stack.pop());
}
stack.pop();
}
else
{
ret = false;
}
}
while(!stack.isEmpty())
{
output.enqueue(stack.pop());
}
if(!ret)
{
output.clear();
}
return ret;
}
QCalculatorDec::QCalculatorDec()
{
m_exp = "";
m_result = "";
QQueue<QString> str;
str = split("9 + (-3 - 1) * 5 + 1");
for(int i = 0; i < str.length(); i++)
{
qDebug() << str[i];
}
qDebug() << match(str) << endl;
QQueue<QString> output;
transform(str, output);
for(int i = 0; i < output.length(); i++)
{
qDebug() << output[i];
}
}