第一次发帖,请教各位大佬一个问题:
使用栈计算中缀表达式的值,首先将中缀表达式转换为后缀表达式,然后再计算后缀表达式得出最终结果。
第一步:首先将中缀表达式转换为后缀表达式
栈定义及基本操作:
struct CNode
{
int cap;
int size;
char* data;
};
typedef struct CNode* cstack;
cstack CreateCStack(int MAXNUM); //创建大小为MAXNUM的栈,存储字符
void CStackIn(char X,cstack S); //入栈
char CStackOut(cstack S); //出栈
char CStackPop(cstack S); //仅仅返回栈顶元素
然后使用函数将中缀表达式转换为后缀表达式
char* InfixToPostfix(char *A) //将中缀表达式转换为后缀表达式
{
char B[20];
int index = 0,i=0;
cstack S;
S = CreateCStack(20);
while(*A!='\0')
{
if(*A >= '0' && *A <= '9')
B[index++] = *A;
else if(*A == '(')
CStackIn(*A,S);
else if(*A == '+' || *A == '-')
{
while(S->size >= 0 && CStackPop(S) != '(')
B[index++] = CStackOut(S);
CStackIn(*A,S);
}
else if(*A == '*' || *A == '/')
{
while(S->size >= 0 && CStackPop(S) != '(' && CStackPop(S) != '+' && CStackPop(S) != '-')
B[index++] = CStackOut(S);
CStackIn(*A,S);
}
else if(*A == ')')
{
while(CStackPop(S) != '(')
B[index++] = CStackOut(S);
(void)CStackOut(S);
}
A++;
}
while(S->size >= 0)
B[index++] = CStackOut(S);
B[index] = '\0';
return B;
}
然后是计算后缀表达式的值,这里需用到另外一个栈:
struct SNode
{
int cap;
int size;
int* data;
};
typedef struct SNode* stack;
stack CreateStack(int MAXNUM);
void StackIn(int X,stack S);
int StackOut(stack S);
以下函数CalPostfix_1()用于计算后缀表达式的值:
int CalPostfix_1(char *A) //计算后缀表达式的值
{
int tmp1 = 0,tmp2 = 0;
stack S;
char* tmp;
//*********************功能验证***********************
printf("tmp输入函数后:");
tmp = A;
while(*tmp != '\0')
{
printf("%c ",*tmp);
tmp++;
}
printf("\n");
//*********************功能验证***********************
S = CreateStack(20);
while(*A != '\0')
{
if(*A >= '0' && *A <= '9')
{
tmp1 = *A - '0';
StackIn(tmp1,S);
}
else
{
tmp1 = StackOut(S);
tmp2 = StackOut(S);
if(*A == '+')
StackIn(tmp2+tmp1,S);
else if(*A == '-')
StackIn(tmp2-tmp1,S);
else if(*A == '*')
StackIn(tmp2*tmp1,S);
else if(*A == '/')
StackIn(tmp2/tmp1,S);
}
A++;
tmp1 = 0;
}
return StackOut(S);
}
现在问题就出在使用该函数CalPostfix_1()传入字符串后,字符串变了导致无法正确计算,如下图所示
上图中有进行后缀表达式功能的验证。
哪位大佬帮帮忙看下问题出在哪,谢谢~
找到问题了,函数InfixToPostfix()将中缀表达式转换为后缀表达式,不应该返回其内部声明的局部数组,而应该讲另一个数组传入,如下图所示。