题目:
输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注:
3.1、表达式只含 +, -, *, / 四则运算符,不含括号
3.2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
3.3、要考虑加减乘除按通常四则运算规定的计算优先级
3.4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
3.5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况
示例:
1)输入:char *expStr = “3*2-5*2+8”
函数返回:4
思路,将乘法和除法先计算,然后再计算+,-,但是要主要,如果从后面计算过来,先减后加的数,要把减号改成加负号:
int calculate(int len, char* expStr)
{
int Res = 0;
bool bFuFlag = false; //如果为减号,则改成+负数
int *pData = new int[len];
char *pOper = new char[len];
memset(pData, 0, sizeof(int));
memset(pOper, 0, sizeof(char));
int iDat = 0;
int iOpe = 0;
for (int i = 0; i < len;i++)
{
if (expStr[i]<='9' && expStr[i]>='0')
{
if (bFuFlag)
{
pData[iDat++] = -(expStr[i] - '0');
bFuFlag = false;
}
else
{
pData[iDat++] = expStr[i] - '0';
}
}
else
{
char sz = expStr[i];
int iFst = 0;
int iSnd = 0;
switch (sz)
{
case '+':
pOper[iOpe++] = sz;
break;
case '-':
pOper[iOpe++] = '+';
bFuFlag = true;
break;
case '*':
iFst = pData[--iDat];
iSnd = expStr[++i] - '0';
pData[iDat++] = iFst*iSnd;
break;
case '/':
iFst = pData[--iDat];
iSnd = expStr[++i] - '0';
pData[iDat++] = iFst / iSnd;
break;
default:
break;
}
}
}
while (iOpe!= 0)
{
char oPer = pOper[--iOpe];
int iFst = pData[--iDat];
int iSnd = pData[--iDat];
if (oPer =='+')
{
iSnd += iFst;
}
else if(oPer == '-')
{
iSnd -= iFst; //注意这是从数组后面倒着过来计算;
}
pData[iDat++] = iSnd; //将计算的结果继续放入尾部
}
Res = pData[--iDat];
return Res;
}
int _tmain()
{
char a[32];
while (cin>>a)
{
int iLen = strlen(a);
cout << calculate(iLen, a) << endl;
}
system("pause");
return 0;
}