Почему мой код останавливается в середине выполнения во время преобразования из инфикса в постфикс? - PullRequest
0 голосов
/ 17 октября 2019

Во время инфикса в постфикс код застрял в процессе. После 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-м цикле

enter image description here

...