struct list
{ char data[1];
struct list *link; };
struct list *temp2, *temp1=0, *temp;
struct list *Operand=0,*Operator;
int Opd=0,Opt=0,StackPointer=0;
int size=0,xFlag=0,zCnt=0;
char Num[1],PopData[1],TheArray[8][100];
char TheOperator[4]=”*/+-“;
char TheOperand[12]=”1234567890()”;
//======================
void Push(char TNum[1],int xtack)
{TNum[1]=’\0′;
StackPointer=0;
temp1=0;
if(xtack==1)
{temp1=Operand;
StackPointer=Opd;
temp1->link=Operand->link; }
else
{temp1=Operator;
StackPointer=Opt;
temp1->link=Operator->link;}
//——————————
if(StackPointer > size)
{ StackPointer–;
printf(“\nStack Overflow”);}
else
{
temp = (list *) malloc(sizeof(struct list));
temp->data[0]=TNum[0];
temp->link = 0;
if(temp1 == 0) {temp1 = temp;}
else
{ temp2 = temp1;
while(temp2->link!=0)
{temp2= temp2->link;}
temp2->link = temp;
} }
//——————————
if(xtack==1)
{Operand=temp1;
Opd=StackPointer;}
else
{Operator=temp1;
Opt=StackPointer;}
}
//==========================
void Display_Stack(int xtack)
{ if(xtack==1)
{temp1=Operand;}
else
{temp1=Operator;}
if(temp1 == 0)
printf(“_”);
else
{ temp2=temp1;
while(temp2->link!=0)
{ cout << (temp2->data[0]);
temp2 = temp2->link; }
cout << (temp2->data[0]);
} }
//======================
char Pop(int xtack)
{ int cntx = 1;
if(xtack==1)
{temp1=Operand;
StackPointer=Opd;}
else
{temp1=Operator;
StackPointer=Opt;}
//———————-
if(temp1 == 0){PopData[0]=’ ‘;}
else
{ temp2 = temp1;
while(temp2->link!=0)
temp2 = temp2->link;
PopData[0]=temp2->data[0];
if(StackPointer == 1)
{ temp2 = temp1 = 0;
StackPointer = 0; }
else
{ temp2 = temp1;
while(cntx < StackPointer-1)
{ temp2 = temp2->link;
cntx++;
}
temp2->link = 0;
StackPointer–;
}
}
//——————–
if(xtack==1)
{Operand=temp1;
Opd=StackPointer;}
else
{Operator=temp1;
Opt=StackPointer;}
return PopData[0];
}
//====================
int IsPriority(char Symbol[1])
{int Prior=0;
Symbol[1]=’\0′;
if ((strcmp(Symbol,”*”)==0) || (strcmp(Symbol,”/”)==0))
{Prior=1;}
else
{Prior=0;}
return Prior;
}
//====================
void Push_Operator(char TNum[1])
{ char vTemp[1];
TNum[1]=’\0′;
if (IsPriority(TNum)==1) {xFlag=1;}
else {xFlag=0;}
Push(TNum,0);
}
//==================
int IsOperator(char Ope[1])
{ int X,Flag=0;
Ope[1]=’\0′;
for (X=0;X<=3;X++)
{if (Ope[0]==TheOperator[X])
{Flag=1;}
}
return Flag; }
//====================
int IsOperand(char Ope[1])
{ int X,Flag=0;
for (X=0;X<=11;X++)
{if (Ope[0]==TheOperand[X])
{Flag=1;}
}
return Flag; }
//===================
void Copy_Stack_to_TheArray()
{ char tempo[1];
temp1=Operand;
if(temp1 == 0)
printf(“_”);
else
{ temp2=temp1;
while(temp2->link!=0)
{ tempo[0]=temp2->data[0]; tempo[1]=’\0′;
strcpy(TheArray[zCnt],tempo); zCnt++;
temp2 = temp2->link; }
tempo[0]=temp2->data[0]; tempo[1]=’\0′;
strcpy(TheArray[zCnt],tempo);
} }
//==================
int Computes(int A,int B,char Symbol[1],int Locate)
{ int Ans,X;
Symbol[1]=’\0′;
switch(Symbol[0])
{ case ‘*’: Ans= A*B; break;
case ‘/’: Ans= A/B; break;
case ‘+’: Ans= A+B; break;
case ‘-‘: Ans= A-B; break;
}
for(X=1;X<=Locate;X++){cout<<” “;}
cout<<‘\b'<<A<< Symbol[0] << B << “=” <<Ans <<“\n”;
return Ans;
}
//===================
void Display_Array()
{ int X;
cout<<“=>³”;
for(X=0;X<=zCnt;X++)
{if (strcmp(TheArray[X],”_”)!=0)
{cout <<TheArray[X]<<“³”;}
else
{cout <<” ³”;}
}
cout<<“\n”;
}
//================
void Adjust_TheArray()
{ int Y,X,A,B;
char vTemp[8]=””;
for(Y=0;Y<=zCnt;Y++)
{for(X=zCnt;X>=0;X–)
{if (strcmp(TheArray[X],”_”)==0 || strcmp(TheArray[X],””)==0)
{ A=X;
for(B=A-1;B>=0; B–)
{if(strcmp(TheArray[B],”_”)!=0 || strcmp(TheArray[B],””)!=0)
{ strcpy(vTemp,TheArray[A]);
strcpy(TheArray[A],TheArray[B]);
strcpy(TheArray[B],vTemp);
break; }}
}}}
}
//================
int StrCmpOperator(char Ope[8])
{ int Flag=0;
switch(Ope[0])
{ case ‘*’: Flag=1; break;
case ‘/’: Flag=1; break;
case ‘+’: Flag=1; break;
case ‘-‘: Flag=1; break;
}
return Flag; }
//================
void main()
{
char Tempx[1],Infix[100],sTemp[10];
int X,XX,Cnt,Ans,A,B;
temp2 = temp1 = 0;
clrscr();
cout <<“Input Infix:”; gets(Infix);
Cnt=strlen(Infix);
size=Cnt;
//—————-
for(XX=0;XX<=Cnt-1;XX++)
{ Num[1]=’\0′;
Num[0]=Infix[XX];
if(IsOperand(Num)==1)
{if (Num[0]==’)’)
{Tempx[0] =’X’;
while (Tempx[0]!=’ ‘)
{Tempx[0]=Pop(0);
if (Tempx[0]!=’ ‘)
{Push(Tempx,1);
Opd++;}}
}
else if(Num[0]=='(‘)
{xFlag=0;}
else
{Push(Num,1); Opd++;
if(xFlag==1)
{Tempx[0]=Pop(0);
Push(Tempx,1);
Opd++;
xFlag=0;}
}
}
else
{if (IsOperator(Num)==1)
{Push_Operator(Num);
Opt++;}}
}
|
دیدگاهتان را بنویسید