QT——计算器核心算法
1.中缀表达式转后缀表达式(1)分离算法数字和符号分离中缀表达式中包含数字和小数点、符号位或-、运算符-*/、括号思想以符号作为标志对表达式中的字符逐个访问当前字符exp[i]为数字或小数点时累计numexp[i]当前字符exp[i]为符号时num为运算数分离并保存若exp[i]为正负号numexp[i]若exp[i]为运算符分离并保存难点如何区分正负号与加号和减号和-在表达式的第一个位置括号后的和-运算符后的和-2中缀表达式转后缀表达式后缀表达式没有括号并且保留中缀表达式中的运算优先级转换过程为当前元素e为数字输出当前元素e为运算符与栈顶运算符进行优先级比较小于等于将栈顶元素输出然后再与栈顶运算符进行优先级比较大于将当前元素e入栈当前元素e为左括号入栈当前元素e为右括号弹出栈顶元素并输出直至栈顶元素为左括号将栈顶的左括号从栈中弹出关键点转化过程中如何确保表达式中的括号能够左右匹配——借助栈3根据后缀表达式计算结果遍历后缀表达式中的数字和运算符当前元素为数字进栈当前元素为运算符从栈中弹出右操作数从栈中弹出坐操作数根据符号进行运算将运算结果压入栈中遍历结束栈中唯一数字为运算结果QCalculatorDec.h#ifndef QCALCULATORDEC_H #define QCALCULATORDEC_H #include QString #include QChar #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); QQueueQString split(const QString exp); //分离算法,QString 就是给这个空盒子贴标签这个队列只能存放 QString 类型的字符串。 bool match(QQueueQString exp); //括号匹配算法 bool transform(QQueueQString exp, QQueueQString output); QString calculate(QQueueQString exp); //计算结果 QString calculate(QString l, QString op, QString r); public: QCalculatorDec(); ~QCalculatorDec(); bool expression(const QString exp); QString expression(); QString result(); }; #endif // QCALCULATORDEC_HQCalculatorDec.cpp#include QCalculatorDec.h QCalculatorDec::QCalculatorDec() { m_exp ; //用户原始输入表达式 m_result ; //计算结果 } QCalculatorDec::~QCalculatorDec() { } 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; QQueueQString spExp split(exp); QQueueQString postExp; m_exp exp; if( transform(spExp,postExp) ) { m_result calculate(postExp); ret (m_result ! Error); } else{ m_result Error; } return ret; } QString QCalculatorDec::expression() { } QString QCalculatorDec::result() { return m_result; } QQueueQString QCalculatorDec::split(const QString exp){ QQueueQString ret; QString num ; QString pre ; //保存前一个字符 for(int i 0; iexp.length(); i){ if( isDigitOrDot(exp[i]) ) //当前字符为小数或小数点 { num exp[i]; pre exp[i]; } else if( isSymbol(exp[i]) ) { if( !num.isEmpty() ) { ret.enqueue(num); //将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; } bool QCalculatorDec::match(QQueueQString exp){ bool ret true; int len exp.length(); QStackQString stack; for(int i 0; ilen; i) { if( isLeft(exp[i]) ) stack.push(exp[i]); else if( isRight(exp[i]) ) { if( !stack.isEmpty() isLeft(stack.top()) ) stack.pop(); else{ ret false; break; } } } return ret; } bool QCalculatorDec::transform(QQueueQString exp, QQueueQString output) { bool ret true; QStackQString stack; output.clear(); while( ret !exp.isEmpty() ) { QString e exp.dequeue(); if( isNumber(e) ) { output.enqueue(e); } else if( isOperator(e) ) { while( !stack.isEmpty() (priority(e) priority(stack.top())) ) { output.enqueue(stack.pop()); } stack.push(e); } else if( isLeft(e) ) { stack.push(e); } else if( isRight(e) ) { while( !stack.isEmpty() !isLeft(stack.top()) ) { output.enqueue(stack.pop()); } if( !stack.isEmpty() ) { stack.pop(); } } else{ ret false; } } while( !stack.isEmpty() ) { output.enqueue(stack.pop()); } if( !ret ) { output.clear(); } return ret; } 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 / ) { const double P 0.000000000000001; if( (-P rp) (rp P) ) { ret Error; } else{ ret.sprintf(%f, lp / rp); } } else{ ret Error; } } return ret; } QString QCalculatorDec::calculate(QQueueQString exp) { QString ret Error; QStackQString stack; while( !exp.isEmpty() ) { QString e exp.dequeue(); if( isNumber(e) ) { stack.push(e); } else if( isOperator(e) ) { QString rp !stack.isEmpty() ? stack.pop() : ; QString lp !stack.isEmpty() ? stack.pop() : ; QString result calculate(lp, e, rp); if( result ! Error ) { stack.push(result); } else{ break; } } else{ //后缀表达式不合法 break; } } if( exp.isEmpty() (stack.size() 1 ) isNumber(stack.top()) ) { ret stack.pop(); } return ret; }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2493071.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!