Во время инфикса в постфикс код застрял в процессе. После 5 цикла он застревает.
В коде от инфикса к постфиксу я пытался создать новый стек, когда новый цикл запускается снова. Поскольку сообщение об ошибке «Пустой стек»
int in2post(char *infix,char *postfix)
{
int Is_oper(char symbol)
{
if(symbol == '+' || symbol == '-' || symbol == '*') return 1;
else return 0;
}
int Precedence(char symbol)
{
if(symbol == '*') return (2);
else if(symbol =='+' || symbol =='-') return (1);
else return (0);
}
int i,j;
char ch,x;
Stack S =CreateStack (1024);
Push('(' , S );
strcat(infix, ")" );
i=0;
j=0;
ch=infix[i];
while( ch != '\0')
{
if(ch == '(' ) Push(ch, S);
else if ( isdigit(ch) )
{
postfix[j] = ch;
j++;
}
else if (Is_oper(ch) == 1)
{
x=TopAndPop(S);
while (Is_oper(x) == 1 && Precedence(x) >= Precedence(ch))
{
postfix[j] = x;
j++;
x=TopAndPop(S);
}
Push(x,S);
Push(ch,S);
}
else if (ch == ')')
{
x = TopAndPop(S);
while(x != '(')
{
postfix[j] = x;
j++;
x = TopAndPop(S);
}
}
else
{
MakeEmpty(S);
return 0;
}
i++;
ch = infix[i];
}
if(S->TopOfStack != 0) {
MakeEmpty(S);
return 0;
}
postfix[j] = '\0';
MakeEmpty(S);
}
TopAndPop возвращает верхнюю часть стека и одновременно удаляет верхнюю часть стека. И если элемента нет, возвращается сообщение «Пустой стек»
void test2()
{
char eq[][128] = {
"1+2*3+(4*5+6)*7",
"1+2*3+((4*5+6)*7)",
"(1+2*3)+(4*5+6)*7",
"(((1)+(2*3))+((4*5+6)*7))",
"1+2*3+((4*5+6)*7",
"1+2*3+(4*5+6)*7)",
"1++2*3+((4*5+6)*7)",
"1+2*3+((4*5+6)*7+)",
"1+2*3+((4*5+6)*7)+",
"1+2*3+(9(4*5+6)*7)",
"1+2*3+((4*5+6)*7)9"
};
char postfix[1024];
int i, r;
printf("[Test3: infix to postfix conversion]\n");
for( i=0 ; i<11 ; i++ ) {
r = in2post(eq[i],postfix);
if( r == 0 ) {
printf(" %s is not valid\n",eq[i]);
} else {
printf(" %s --> %s\n",eq[i],postfix);
}
}
}
В test2 не работает в 6-м цикле