当前位置: 首页 > news >正文

慈溪建设银行支行网站广西网站建设

慈溪建设银行支行网站,广西网站建设,公司网站如何做二维码,百度竞价推广属于什么广告计算器核心算法: 1、将中缀表达式进行数字和运算符的分离 2、将中缀表达式转换成后缀表达式 3、通过后缀表达式计算最后的结果 二、计算器中缀转后缀算法 计算器中缀转后缀算法的意义在于把中缀表达式转换成后缀表达式,能够更好地计算 算法的基本思路…

计算器核心算法:

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;
}

4、计算器后缀表达式计算算法

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 == "/"){double delta = 0.0000000001;if(rp >= -delta && rp <= delta){ret = "Error";}else{ret.sprintf("%f", lp / rp);}}else{ret = "Error";}}return ret;
}QString QCalculatorDec::calculate(QQueue<QString>& exp)
{QString ret = "Error";QStack<QString> stack;while(!exp.isEmpty()){QString str = exp.dequeue();if(isNumber(str)){stack.push(str);}else if(isOperator(str)){QString rp = !stack.isEmpty() ? stack.pop() : "";QString lp = !stack.isEmpty() ? stack.pop() : "";QString result = calculate(lp, str, rp);if(result != "Error"){stack.push(result);}else{break;}}}if(exp.isEmpty() && stack.size() == 1 && isNumber(stack.top())){ret = stack.pop();}return ret;
}

5、通过一个函数包含所有计算器的核心算法

bool QCalculatorDec::expression(const QString& exp)
{bool ret = false;QQueue<QString> spExp = split(exp);QQueue<QString> postExp;m_exp = exp;if(transform(spExp, postExp)){m_result = calculate(postExp);ret = (m_result != "Error");}else{m_result = "Error";}return ret;
}
QString QCalculatorDec::result()
{return m_result;
}

计算器算法实现的源代码:

QCalculatorDec.h

#ifndef QCALCULATORDEC_H
#define QCALCULATORDEC_H
#include <QQueue>
#include <QString>
#include <QStack>#include "ICalculator.h"
class QCalculatorDec
{
protected:QString m_exp;QString m_result;bool isDigitOrDot(QChar c);bool isSign(QChar c);bool isSymbol(QChar c);bool isOperator(QString s);bool isLeft(QString s);bool isRight(QString s);bool isNumber(QString s);int priority(QString s);QQueue<QString> split(const QString& exp);bool match(QQueue<QString>& exp);bool transform(QQueue<QString>& exp, QQueue<QString>& output);QString calculate(QString l, QString op, QString r);QString calculate(QQueue<QString>& exp);
public:QCalculatorDec();bool expression(const QString& exp);QString expression();QString result();~QCalculatorDec();
};#endif // QCALCULATORDEC_H

QCalculatorDec.cpp

#include "QCalculatorDec.h"
#include <QDebug>
QCalculatorDec::QCalculatorDec()
{m_exp = "";m_result = "";
}bool QCalculatorDec::isDigitOrDot(QChar c)
{return ((c >= '0')&&(c <= '9'))||(c == '.');
}bool QCalculatorDec::isSign(QChar c)
{return (c == '+')||(c == '-');
}bool QCalculatorDec::isSymbol(QChar c)
{return isOperator(c)||(c == '(')||(c == ')');
}bool QCalculatorDec::isOperator(QString s)
{return (s == "+")||(s == "-")||(s == "*")||(s == "/");
}bool QCalculatorDec::isLeft(QString s)
{return (s == "(");
}bool QCalculatorDec::isRight(QString s)
{return (s == ")");
}bool QCalculatorDec::isNumber(QString s)
{bool ret = false;s.toDouble(&ret);return ret;
}int QCalculatorDec::priority(QString s)
{int ret = 0;if(s == "+"||s == "-"){ret = 1;}else if(s == "*"||s == "/"){ret = 2;}return ret;
}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 == "" || isLeft(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(QQueue<QString>& exp)
{bool ret = true;QStack<QString> stack;for(int i = 0; i < exp.length(); i++){if(isLeft(exp[i])){stack.push(exp[i]);}else if(isRight(exp[i])){if(isLeft(stack.top())){stack.pop();}else{ret = false;}}}if(!stack.isEmpty()){ret = false;}return ret;
}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;
}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 == "/"){double delta = 0.0000000001;if(rp >= -delta && rp <= delta){ret = "Error";}else{ret.sprintf("%f", lp / rp);}}else{ret = "Error";}}return ret;
}QString QCalculatorDec::calculate(QQueue<QString>& exp)
{QString ret = "Error";QStack<QString> stack;while(!exp.isEmpty()){QString str = exp.dequeue();if(isNumber(str)){stack.push(str);}else if(isOperator(str)){QString rp = !stack.isEmpty() ? stack.pop() : "";QString lp = !stack.isEmpty() ? stack.pop() : "";QString result = calculate(lp, str, rp);if(result != "Error"){stack.push(result);}else{break;}}}if(exp.isEmpty() && stack.size() == 1 && isNumber(stack.top())){ret = stack.pop();}return ret;
}bool QCalculatorDec::expression(const QString& exp)
{bool ret = false;QQueue<QString> spExp = split(exp);QQueue<QString> 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()
{return  m_exp;
}QString QCalculatorDec::result()
{return m_result;
}QCalculatorDec::~QCalculatorDec()
{}
http://www.mnyf.cn/news/53333.html

相关文章:

  • 政府制作网站收费google官方下载安装
  • 怎么用电脑做网站虚拟空间sem优化托管公司
  • 手机怎么做电子书下载网站哪里能买精准客户电话
  • 丽江市建设局官方网站网页推广平台
  • 如何做网站导航栏平台推广公司
  • wordpress free杭州百度优化
  • 网上商城建站工作室网络推广赚钱
  • 企业vi包括哪些内容seo优化百度技术排名教程
  • 崇信县门户网站官网seo常见优化技术
  • 曲靖网站建设公司靖网站建设永久免费自助建站系统
  • 网站建设方案文档天津网站快速排名提升
  • 重庆网站建设流程鸡西网站seo
  • 建网页还是网站好手机怎么创建自己的网站平台
  • 新浪网站怎么做推广seo排名工具给您好的建议下载官网
  • 哪个教育网站做助理造价师培训2023北京封控了
  • 请人做软件开发的网站企业网站优化方案案例
  • 上海环球金融中心美食真实有效的优化排名
  • 内推网站自己开发网站
  • 北京 外贸网站建设如何创建一个app
  • 免费装潢设计网站flash源码模版php生成html免费下载常用搜索引擎有哪些
  • 常见的erp软件有哪些seo优化易下拉霸屏
  • 简单的网站设计多少钱如何在微信上做推广
  • 网站版权备案网络营销岗位技能
  • 大庆北京网站建设邵阳seo排名
  • 网上接网站开发类订单的平台优化师的工作内容
  • 开发企业网站费用女教师遭网课入侵直播录屏曝光8
  • wordpress建企业门户重庆seo杨洋
  • 牡丹江地区做网站的公司百度seo排名优化费用
  • 做网站怎样找2022年新闻摘抄十条简短
  • 南宁网站建设地方网页制作培训网站