源代码如下:
头文件
#ifndef _CALCULATORCORE_H_#define _CALCULATORCORE_H_#include <QString>#include <QStack>#include <QQueue>class QCalculatorDec{protected:QString m_exp; //运算表达式QString m_result; //计算结果bool isDigitOrDot(QChar c);//数字或小数点bool isSymbol(QChar c);// 是符号bool isSign(QChar c); //bool isNumber(QString s);bool isOperator(QString s);bool isLeft(QString s);bool isRight(QString s);int priority(QString s);QQueue<QString> split(const QString& exp);public:QCalculatorDec();~QCalculatorDec();bool expression(const QString& exp);QString expression();QString result();};#endif
源文件
#include "QCalculatorDec.h"#include <QDebug>QCalculatorDec::QCalculatorDec(){m_exp = "";m_result = "";QQueue<QString> r = split("+10.3 +(-3 - -0.54)* +100");for(int i=0; i<r.length(); i++){qDebug() << r[i];}}QCalculatorDec::~QCalculatorDec(){}//是否为数字(0-9)或者小数点bool QCalculatorDec::isDigitOrDot(QChar c){return (('0' <= c) && (c <= '9')) || (c == '.');}//是否为操作符或者括号bool QCalculatorDec::isSymbol(QChar c){return isOperator(c) || (c == '(') || (c == ')');}//是否为正负号bool QCalculatorDec::isSign(QChar c){return (c == '+') || (c == '-');}//是否为一个合法的数字bool QCalculatorDec::isNumber(QString s){bool ret = false;s.toDouble(&ret);return ret;}// 是否是运算符bool QCalculatorDec::isOperator(QString s){return (s == "+") || (s == "-") || (s == "*") || (s == "/");}// 是否为左括号bool QCalculatorDec::isLeft(QString s){return (s == "(");}//是否为右括号bool QCalculatorDec::isRight(QString s){return (s == ")");}//符号优先级int QCalculatorDec::priority(QString s){int ret = 0;if( (s == "+") || (s == "-") ){ret = 1;}if( (s == "*") || (s == "/") ){ret = 2;}return ret;}bool QCalculatorDec::expression(const QString& exp){bool ret = false;return ret;}QString QCalculatorDec::result(){return m_result;}//分离符号和数字的分离算法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]) && ((pre == "") || (pre == "(") || isOperator(pre)) ){num += exp[i];//存储正负号}else{ret.enqueue(exp[i]); // 运算符入队列}pre = exp[i];//保存上一个字符}}if( !num.isEmpty() ){ret.enqueue(num);//最后一个运算数}return ret;}
954

被折叠的 条评论
为什么被折叠?



