中缀表达式转换为后缀表达式并求值
中缀表达式转换为后缀表达式并求值,就是将前两个组合起来。
函数懒得改,直接把两个函数都用上0.0
代码代码如下
#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
typedef struct status* Status;
struct status
{
ElemType Data;
struct status* Next;
};
Status Creatstatus()
{
Status headnode=(Status)malloc(sizeof(struct status));
headnode->Next=NULL;
return headnode;
}
Status Push(Status D,char X)
{
Status newnode=(Status)malloc(sizeof(struct status));
newnode->Data=X;
newnode->Next=D->Next;
D->Next=newnode;
}
Status Pop(Status D)
{
if(D->Next==NULL)
{
return -1;
}
Status p=D->Next;
char X;
X=p->Data;
D->Next=p->Next;
free(p);
return X;
}
Status Top(Status D)
{
if(D->Next==NULL)
{
return -1;
}
return D->Next->Data;
}
int Isempty(Status D)
{
if(D->Next==NULL)
{
return -1;
}
return 0;
}
typedef int AElemType;
typedef struct Astatus* AStatus;
struct Astatus
{
AElemType Data;
struct Astatus* Next;
};
AStatus ACreatstatus()
{
AStatus headnode=(AStatus)malloc(sizeof(struct Astatus));
headnode->Next=NULL;
return headnode;
}
AStatus APush(AStatus D,int X)
{
AStatus newnode=(AStatus)malloc(sizeof(struct Astatus));
newnode->Data=X;
newnode->Next=D->Next;
D->Next=newnode;
}
AStatus APop(AStatus D)
{
if(D->Next==NULL)
{
return -1;
}
AStatus p=D->Next;
int X;
X=p->Data;
D->Next=p->Next;
free(p);
return X;
}
AStatus ATop(AStatus D)
{
if(D->Next==NULL)
{
return -1;
}
return D->Next->Data;
}
int AIsempty(AStatus D)
{
if(D->Next==NULL)
{
return -1;
}
return 0;
}
int main()
{
char expressions[100100];
Status D=Creatstatus();
int i=0;
char X;
char A[100100]={};
int idx=0;
int z=0;
int n;
scanf("%d",&n);
getchar();
for( z=0;z<n;z++)
{
gets(expressions);
idx=0;
for(i=0;expressions[i]!=0;i++)
{
if((expressions[i]>='0')&&(expressions[i]<='9'))
{
printf("%c",expressions[i]);
A[idx]=expressions[i];
idx++;
}
else
{
X=expressions[i];
if(Isempty(D)==-1)
{
Push(D,X);
}
else
{
if(expressions[i]=='(')
Push(D,X);
else if(expressions[i]==')')
{
while(Top(D)!='(')
{
printf("%c",Top(D));
A[idx]=Top(D);
idx++;
Pop(D);
}
Pop(D);
}
else if((expressions[i]=='-')||(expressions[i]=='+'))
{
while(D->Next!=NULL)
{
if(Top(D)!='(')
{
printf("%c",Top(D));
A[idx]=Top(D);
idx++;
Pop(D);
}
else
break;
}
Push(D,expressions[i]);
}
else if((X=='*')||(X=='/'))
{
if((Top(D)=='*')||(Top(D)=='/'))
{
printf("%c",Top(D));
A[idx]=Top(D);
idx++;
Pop(D);
Push(D,X);
}
else
{
Push(D,expressions[i]);
}
}
}
}
}
while(Isempty(D)==0)
{
Status p=D->Next;
printf("%c",p->Data);
A[idx]=p->Data;
idx++;
Pop(D);
}
printf(" ");
AStatus second=ACreatstatus();
int x,y,z;
int change;
for(i=0;A[i]!=0;i++)
{
if((A[i]>='0')&&(A[i]<='9'))
{
change=A[i]-'0';
APush(second,change);
}
else if(A[i]=='+')
{
y=APop(second);
x=APop(second);
z=x+y;
APush(second,z);
}
else if(A[i]=='-')
{
y=APop(second);
x=APop(second);
z=x-y;
APush(second,z);
}
else if(A[i]=='*')
{
y=APop(second);
x=APop(second);
z=x*y;
APush(second,z);
}
else if(A[i]=='/')
{
y=APop(second);
x=APop(second);
z=x/y;
APush(second,z);
}
}
printf("%d",ATop(second));
printf("\n");
for( i=0;i<100100;i++)
{
A[i]=0;
}
}
return 0;
}
202104241733