Здесь я преобразую инфиксное выражение в префиксное выражение.
Для некоторых тестовых случаев мой результат идеален.
Но для некоторых тестовых случаев я получаю вывод, который является правильным для некоторых сайтов, но неправильным для других сайтов. Поэтому передо мной стоит дилемма: правильный ли мой код или нет.
Например, если инфиксное выражение равно:
A+B*C+D
, то вывод по моему коду:
+A+*BCD
Но на некоторых сайтах выходные данные упоминаются как:
++A*BCD
для того же ввода.
#include<stdio.h>
#include<string.h>
int main()
{
int top=-1,k=0,i,l,top2=-1,j,a,t,m,t1;
char s[100] ,s2[100],n, main[100];
char q[100],p[100];
printf("\nenter string :");
gets(main);
for(i=strlen(main)-1;i>=0;i--)
{
if(main[i]=='(')
{
q[k]=')';
}
else if(main[i]==')')
{
q[k]='(';
}
else
{
q[k]=main[i];
}
q[k+1]='\0';
k++;
}
k=0;
strcat(q,")");
s[++top]='(';
for(i=0;i<strlen(q);i++)
{
if(q[i]>='a' && q[i]<='z' || q[i]>='A' && q[i]<='Z' || q[i]>='0' && q[i]<='9')
{
p[k]=q[i];
p[k+1]='\0';
k++;
}
else if (q[i]=='(')
{
s[++top]=q[i];
}
else if (q[i]==')')
{
for(j=top;j>=0;j--)
{
if(s[j]!='(')
{
s[top--];
p[k]=s2[top2];
p[k+1]='\0';
s2[top2--];
k++;
}
else
break;
}
s[top--];
}
else if(q[i]=='+' || q[i]=='-' || q[i]=='*' || q[i]=='/' || q[i]=='^' || q[i]=='%')
{
if(q[i]=='+' || q[i]=='-')
{
n='1';
}
else if(q[i]=='*' || q[i]=='/' || q[i]=='%')
{
n='2';
}
else if (q[i]=='^')
{
n='3';
}
t=n-48;
if(top2!=-1)
{
for(j=top;j>=0;j--)
{
t1=s[j]-48;
if(t<=t1 )
{
s[top--];
p[k]=s2[top2];
p[k+1]='\0';
k++;
s2[top2--];
}
else if(s[j]=='(')
break;
}
}
s[++top]=n;
s2[++top2]=q[i];
}
}
k=0;
for(i=strlen(p)-1;i>=0;i--)
{
main[k]=p[i];
main[k+1]='\0';
k++;
}
printf("\nFINAL ANSWER :\n");
printf("\n%s",main);
}