我正在编写中缀到postfix函数的过程中。在它循环几次(第8或第9个循环)之后,我的后缀数组将不再接受任何其他字符(它设置为100)。
void convertToPost(char infix[], char postfix[])
{
StackNode *pMem=NULL;
int i=-1,j=0, priority=0,priorityStack=0,operandCounter=0;
push(&pMem,'(');
infix[strlen(infix)]=')';
printf("%s\n",infix);
for(j=0;j<strlen(infix);j++)
{
putchar('\n');
printf("infix[%d]: %s\n",j,infix);
printf("postfix[%d]: %s\n",j,postfix);
putchar('\n');
if(infix[j] <= 57 && infix[j] >= 48)
{
i++;
postfix[i]=infix[j]; // not assigning value 8 to postfix
i++;
postfix[i] = ' ';
}
else if(infix[j] == '(')
{
push(&pMem,infix[j]);
//pop(&pMem);
}
else if(infix[j] == ')')
{
while(pMem->pNext != NULL)
{
if(pMem->pString == '(')
{
pop(&pMem);
}
else
{
postfix[i]= ' ';
i++;
postfix[i] = pMem->pString;
i++;
pop(&pMem);
}// figure out how to take char from top of stack and put in postfix something pop()
//push(&pMem,'(');
}
push(&pMem,'(');
//pop(&pMem);
}
else if(infix[j] == '+' || infix[j] == '-' || infix[j] == '^' || infix[j] == '*' || infix[j] == '/' || infix[j] == '%')
{
//i--;
if(operandCounter==0)
{
push(&pMem,infix[j]);
operandCounter++;
}
else
{
priority=Precedence(infix[j]);
priorityStack=Precedence(pMem->pString);//pString is empty
if(priority >= priorityStack)
{
if(pMem->pString != '(')
{
i++;
postfix[i]=pMem->pString;
i++;
postfix[i]=' ';
pop(&pMem);
push(&pMem,infix[j]);
}
else
{
push(&pMem,infix[j]);
}
}
}
}
}
}
这是我使用的示例等式:9 *(5-4)+2/6 其输出应为:(9 5 4 - * 2 6 / +)
我先发表评论问题。它在达到这一点后持续不断。例如,当我运行代码时,它返回:9 5 4 - *
但不提供错误代码或任何内容。
如果您想要其他一些功能(即优先级,推送,弹出),请随时询问。
答案 0 :(得分:0)
,for loop()
值未定义。因为要替换字符串中的终止NULL字符。strlen(infix)
这导致infix[strlen(infix)]=')';
返回未定义的值。
所以改变
strlen()
到
infix[strlen(infix)]=')';
还要确保为阵列分配了足够的内存,以便数组中的 int len = strlen(infix);
infix[len]=')';
infix[len+1] = '\0';
索引不会超出边界访问权限。