{
backStr[m++] = oper.topElem();
oper.pop();
}
oper.push(midStr[i]);
}
else if ((midStr[i] == '*')||(midStr[i] == '/'))
{
oper.push(midStr[i]);
}
else if (midStr[i] == ')')
{
while(oper.topElem()!= '(')
{
backStr[m++] = oper.topElem();
oper.pop();
}
oper.pop();
}
}
while(!oper.isEmpty())
{
backStr[m++] = oper.topElem();
oper.pop();
}
backStr[m] = '\0';
}
}
在得到后缀表达式后,对表达式进行计算,如后缀表达式为123*+45*6-7*+,同样借助栈操作,当遇到操作数时压入栈,遇到操作符则依次弹出两个栈顶元素计算(需要注意:一、计算顺序,二、压入的是下标,计算时需要将对应的操作数提取出来计算)后压入栈,实现如下:
[cpp]
float calcu(char* backStr,int m, float* fig)
{
stack
float a,b,c,result = 0.0;
for (int i = 0; i< m;i++)
{
if (backStr[i]>='1')
{
//将数字对应到float中的数字,并放入栈
int tempSubscript = backStr[i]-'1';
sResult.push(fig[tempSubscript]);
}
else if(backStr[i] == '-')
{
a = sResult.pop();
b = sResult.pop();
c = b-a;
sResult.push(c);
}
else if (backStr[i] == '+')
{
a = sResult.pop();
b = sResult.pop();
c = b+a;
sResult.push(c);
}
else if (backStr[i] == '*')
{
a = sResult.pop();
b = sResult.pop();
c = b*a;
sResult.push(c);
}
else if (backStr[i] == '/')
{
a = sResult.pop();
b = sResult.pop();
c = b/a;
sResult.push(c);
}
}
result = sResult.pop();
return result;
}
float calcu(char* backStr,int m, float* fig)
{
stack
float a,b,c,result = 0.0;
for (int i = 0; i< m;i++)
{
if (backStr[i]>='1')
{
//将数字对应到float中的数字,并放入栈
int tempSubscript = backStr[i]-'1';
sResult.push(fig[tempSubscript]);
}
else if(backStr[i] == '-')
{
a = sResult.pop();
b = sResult.pop();
c = b-a;
sResult.push(c);
}
else if (backStr[i] == '+')
{
a = sResult.pop();
b = sResult.pop();
c = b+a;
sResult.push(c);
}
else if (backStr[i] == '*')
{
a = sResult.pop();
b = sResult.pop();
c = b*a;
sResult.push(c);
}
else if (backStr[i] == '/')
{
a = sResult.pop();
b = sResult.pop();
c = b/a;
sResult.push(c);
}
}
result = sResult.pop();
return result;
}
计算结果出来之后,需要对计算结果进行分析:首先表达式中是否有十六进制,如果有十六进制且结果为整数则需要转化为十六进制输出,否则就按照i整数或者小数输出,所以这里还需要进行判断是否为整数,和十进制转化为十六进制。
[cpp]
void tenToSixteen(char* sixteen,int n)
{
int shang = 0;
int yushu = 0;
int value = 1;
int i = 0;
while(value <= n)
{
value = value*16;
yushu = n % value;
shang = yushu * 16 /value;
if (shang >=0 && shang <=9)
{
sixteen[i] = (char)(shang+48);
}
else
{
sixteen[i] =(char)(shang+87);
}
i++;
}
char str[g_iconstArrayMax] = "0x";
strrev(sixteen);
strcat(str,sixteen);
strcpy(sixteen,str);
}
//判断结果是不是int型
bool isInte(float fresult)
{
char fresultStr[g_iconstArrayMax];
sprintf(fresultStr,"%f",fresult);
if (NULL == fresultStr)
{
return false;
}
else
{
int len = strlen(fresultStr);