// .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);
}