我用QT4 写的计算器核心算法代码

 

 

 

//  .h 文件

#ifndef OUTPUTSTRING_H

#define OUTPUTSTRING_H
#include <QObject>
#include <QString>
#include <QStack>
class myOutputString
{
public:
    myOutputString(QString& Str);
    void setMyString(QString& Str);
    QString& getMyString(void);
private:
    void deleteAll(void);
    int isNumStr(QString& Str);
    int isPointStr(QString& Str);
    void setPointStr(QString& Str);
    int isOperator(QString& Str);
    int isSignStr(QString& Str);
    int isPlusStr(QString& Str);
    int isMinusStr(QString& Str);
    int isEqualStr(QString& Str);
    int isMultiStr(QString& Str);
    int isDivideStr(QString& Str);
    void setPointToMyString(QString& Str);
    void setSignToMyString(QString& Str);
    QString& getValue(QString& Str);
    void setMyNumStr(QString& Str);
    void setOperatorStr(QString& Str);
    QStack <QString>  myString;
};
#endif // OUTPUTSTRING_H

 

//  .c 文件

#include "OutputString.h"

#include "QVariant"
myOutputString::myOutputString(QString& Str)
{
}
void myOutputString::setMyString(QString& Str)
{
    QString StrButton("Clear");
    if(StrButton == Str)    //删除
        deleteAll();
    else if(isNumStr(Str))       //保存数字
        setMyNumStr(Str);
    else if(isSignStr(Str))      //保存符号
        setSignToMyString(Str);
    else if(isOperator(Str))     //判断是否为运算符
        setOperatorStr(Str);
    else if(isPointStr(Str))
        setPointStr(Str);
    StrButton = "Clear";
}
QString& myOutputString::getMyString(void)
{
    QString static ZeroStr("0");
    if(myString.isEmpty())
        return ZeroStr;
    static QString topStr;
    QString myStr;
    topStr = myString.pop();
    if(isOperator(topStr)
    &&(myString.count()==3))
    {
        QString secondNumStr = myString.pop();
        QString opeStr = myString.pop();
        QString firstNumStr = myString.pop();
        double firstNum = firstNumStr.toDouble();
        double secondNum = secondNumStr.toDouble();
        double equal = 0;
        if(opeStr == "*")
            equal = firstNum * secondNum;
        else if(opeStr == "/")
            equal = firstNum / secondNum;
        else if(opeStr == "+")
            equal = firstNum + secondNum;
        else if(opeStr == "-")
            equal = firstNum - secondNum;
        QVariant var1(equal);
        myStr = var1.toString();
        myString.push(myStr);
    }
    if(topStr != "=")
        myString.push(topStr);
    topStr = myString.top();
    return topStr;
}
void myOutputString::deleteAll(void)
{
    myString.clear();
}
int myOutputString::isNumStr(QString& Str)
{
    bool ok = 0;
    Str.toInt(&ok, 10);
    if(ok == 1)
        return 1;
    return 0;
}
int myOutputString::isPointStr(QString& Str)
{
    if (Str.toAscii() == QByteArray("."))
        return 1;
    else
        return 0;
}
void myOutputString::setPointStr(QString& Str)
{
   QString MyStr;
   QString::const_iterator firstStr;
   if(myString.isEmpty())
       return;
    MyStr = myString.pop();
    firstStr = MyStr.begin();
   if(isOperator(MyStr))
   {
       myString.push(MyStr);
       return;
   }
   if(MyStr.count(".") > 0)
       ;
   else
       MyStr.append(".");
   myString.push(MyStr);
}
int myOutputString::isOperator(QString& Str)
{
    if(isPlusStr(Str)
    ||isMinusStr(Str)
    ||isMultiStr(Str)
    ||isDivideStr(Str)
    ||isEqualStr(Str))
        return 1;
    else
        return 0;
}
int myOutputString::isSignStr(QString& Str)
{
    if(Str == "+/-")
        return 1;
    else
        return 0;
}
int myOutputString::isPlusStr(QString& Str)
{
    if(Str == "+")
        return 1;
    else
        return 0;
}
int myOutputString::isMinusStr(QString& Str)
{
    if(Str == "-")
        return 1;
    else
        return 0;
}
int myOutputString::isEqualStr(QString& Str)
{
    if(Str == "=")
        return 1;
    else
        return 0;
}
int myOutputString::isMultiStr(QString& Str)
{
    if(Str == "*")
        return 1;
    else
        return 0;
}
int myOutputString::isDivideStr(QString& Str)
{
    if(Str == "/")
        return 1;
    else
        return 0;
}
void myOutputString::setPointToMyString(QString& Str)
{
}
void myOutputString::setSignToMyString(QString& Str)
{
   QString MyStr = myString.pop();
   QString::const_iterator firstStr = MyStr.begin();
   if(isOperator(MyStr))
   {
       myString.push(MyStr);
       return;
   }
   if((*firstStr) == '-')
      MyStr.remove(0,1);
   else
      MyStr.insert(0, '-');
   myString.push(MyStr);
}
QString& myOutputString::getValue(QString& Str)
{
}
void myOutputString::setMyNumStr(QString& Str)
{
    //判断stack top是否为操作符号
    QString topStr;
    if(myString.isEmpty())
    {
        myString.push(Str);
        return;
    }
    topStr = myString.pop();
    if(isOperator(topStr))
    {
        myString.push(topStr);
        myString.push(Str);//stack top 是操作符,Str放到stack 尾部
    }
    else
    {
        topStr.append(Str);
        myString.push(topStr);//stack top 不是操作符,Str放到stack top 元素里
    }
}
void myOutputString::setOperatorStr(QString& Str)
{
    QString topStr;
    if(myString.isEmpty())
        return;
    topStr = myString.top();
    if(isOperator(topStr))
        myString.push(Str);
    else
        myString.push(Str);
}

你可能感兴趣的:(算法,iterator,qt)