Когда в вашем коде нет элемента stack
, т. Е. top = -1 , и вы вызываете priority
, так как он возвращает мусор + IMO top
должен возвращать no. элементов в стеке для простоты, а не позиции в массиве.
Кроме того, измененная ассоциативность не будет служить цели, поскольку a-b
обычно не равно b-a
.
Вот исправленный код:
#include<stdio.h>
#include<ctype.h>
char stack[20];
int top = 0; //CHANGE 1 -NOW IT MEANS NO. OF ELEMENTS IN THAT STACK
void push(char x)
{
stack[top++] = x;
}
void swap(char c[],int i, int j)
{
char temp;
temp =c[i];
c[i] = c[j];
c[j] = temp;
}
char pop()
{
return stack[--top]; //CHANGE 2
}
int priority(char x)
{
if(x=='^')
return 3; //CHANGE 3 - CONCEPTUAL
if(x == '+' || x == '-')
return 1;
else if(x == '*' || x == '/')
return 2;
return -1;
}
int main()
{
char exp[20];
char *e, x;
printf("Enter the expression :: ");
scanf("%s",exp);
//CHANGE INDUCED AS ASSOCIATIVITY HAS BEEN REVERSED FOR OPERATORS OTHER THAN '^'
int i=0,length=strlen(exp);
while(i<length/2) //REVERSING THE INPUT EXPRESSION
{
swap(exp,i,length-i-1);
++i;
}
e = exp;
while(*e != '\0')
{
if(*(e+1)=='^') //ASSOCIATIVITY OF THIS OPERATOR HAS BEEN KEPT AS USUAL HENCE REVERSING A SMALL PART JUST TO COMPUTE IT AS USUAL
{
swap(e,0,2);
}
x=*e; //CHANGE 4
if(isalnum(x))
printf("%c",x);
else
{
while((top>0)&&(priority(stack[top-1]) > priority(x))) //CHANGE 5
printf("%c",pop());
push(x);
}
e++;
}
while(top>0) //CHANGE 5
{
printf("%c",pop());
}
return 0;
}
ВХОД:
a+b^c
cab^-
a+b*c^d
ВЫХОД (с обратной ассоциативностью операторов, кроме '^'):
1.
bc^a+
ab^c+
cd^b*a+