计算器核心算法:
1、将中缀表达式进行数字和运算符的分离
2、将中缀表达式转换成后缀表达式
3、通过后缀表达式计算最后的结果
一、计算器分离算法
计算器分离算法的意义在于把一串我们写成的算式字符串表达式进行数字和运算符的分离,主要难点在于如何区分正负号和加减号。
- 满足以下几个特征都是正负号:
1、+、- 号在表达式的第一个位置
2、括号后面的+、- 号
3、运算符后面的+、- 号 - 算法的基本思路
1、如果是数字或小数点,集合起来
2、如果是运算符,把集合起来的字符串进队列;如果运算符是正负号,加上后面跟随的数字集合起来
3、其余的运算符直接进队列
4、剩下的数字进队列
QQueue<QString> QCalculatorDec::split(const QString& exp)
{
QQueue<QString> ret;
QString num = "";
QString pre = "";
for(int i = 0; i < exp.length();i++)
{
if(isDigitOrDot(exp[i]))
{
num += exp[i];
pre = exp[i];
}
else if(isSymbol(exp[i]))
{
if(!num.isEmpty())
{
ret.enqueue(num);
num.clear();
}
if(isSign(exp[i])&&(isOperator(pre)||isLeft(pre)||pre == ""))
{
num += exp[i];
}
else
{
ret.enqueue(exp[i]);
}
pre = exp[i];
}
}
if(!num.isEmpty())
{
ret.enqueue(num);
}
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];
}
}