#include
#include
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define INFEASIBLE -2
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
void SqStack_Init(SqStack &S)
{
S.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
if(!S.base)
exit(INFEASIBLE);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
}
void SqStack_Push(SqStack &S,int Elem)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(int *)realloc(S.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(int));
if(!S.base)
exit(INFEASIBLE);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=Elem;
}
int SqStack_Pop(SqStack &S,int &Elem)
{
if(S.base==S.top)
return ERROR;
Elem=*--S.top;
return OK;
}
int SqStack_Gettop(SqStack &S,int &Elem)
{
if(S.base==S.top)
return ERROR;
Elem=*(S.top-1);
return OK;
}
int SqStack_Show(SqStack &S)
{
int *Base=S.base;
if(S.base==S.top)
return ERROR;
while(Base!=S.top)
{
printf("%d ",*Base);
Base++;
}
printf("\n");
return OK;
}
int Bracket_Match(char expression[])
{
int i,State,Elem;
SqStack S;
SqStack_Init(S);
for(i=0;expression[i]!='\0';i++)
{
switch(expression[i])
{
case '(':
case '[':
case '{':
SqStack_Push(S,expression[i]);
break;
case ')':
State=SqStack_Pop(S,Elem);
if(State==ERROR||Elem!=(int)'(')
return ERROR;
break;
case ']':
State=SqStack_Pop(S,Elem);
if(State==ERROR||Elem!=(int)'[')
return ERROR;
break;
case '}':
State=SqStack_Pop(S,Elem);
if(State==ERROR||Elem!=(int)'{')
return ERROR;
break;
}
}
State=SqStack_Gettop(S,Elem);
if(State==ERROR)
return OK;
return ERROR;
}
int Expression_Check(char expression[])
{
int i,flag1,flag2;
for(i=1;expression[i]!='\0';i++)
{
switch(expression[i-1])
{
case '+':
case '-':
case '*':
case '/':
case '(':
flag1=1;
break;
default:
flag1=0;
}
switch(expression[i])
{
case '+':
case '-':
case '*':
case '/':
case ')':
flag2=1;
break;
default:
flag2=0;
}
if(flag1*flag2)
return ERROR;
}
switch(expression[i-1])
{
case '+':
case '-':
case '*':
case '/':
case '(':
return ERROR;
}
return OK;
}
int Mid_Rear(char Mid[],char Rear[])
{
int State,i,j=0,Elem;
SqStack S;
SqStack_Init(S);
State=Expression_Check(Mid);
if(State==ERROR)
return ERROR;
for(i=0;Mid[i]!='\0';i++)
{
switch(Mid[i])
{
case '+':
case '-':
State=SqStack_Gettop(S,Elem);
while(State!=ERROR&&Elem!=(int)'(')
{
Rear[j++]=Elem;
State=SqStack_Pop(S,Elem);
State=SqStack_Gettop(S,Elem);
}
SqStack_Push(S,(int)Mid[i]);
break;
case '*':
case '/':
State=SqStack_Gettop(S,Elem);
while(State!=ERROR&&Elem!=(int)'('&&Elem!=(int)'+'&&Elem!=(int)'-')
{
Rear[j++]=Elem;
State=SqStack_Pop(S,Elem);
State=SqStack_Gettop(S,Elem);
}
SqStack_Push(S,(int)Mid[i]);
break;
case '(':
SqStack_Push(S,(int)Mid[i]);
break;
case ')':
State=SqStack_Pop(S,Elem);
while(State!=ERROR&&Elem!=(int)'(')
{
Rear[j++]=Elem;
State=SqStack_Pop(S,Elem);
}
if(State==ERROR)
return ERROR;
break;
default:
Rear[j++]=Mid[i];
}
}
State=SqStack_Pop(S,Elem);
while(State!=ERROR&&Elem!=(int)'(')
{
Rear[j++]=Elem;
State=SqStack_Pop(S,Elem);
}
if(Elem==(int)'(')
return ERROR;
Rear[j]='\0';
return OK;
}
void Caculation(char Rear[],int &Result)
{
int i,State,Elem1,Elem2;
SqStack S;
SqStack_Init(S);
for(i=0;Rear[i]!='\0';i++)
{
switch(Rear[i])
{
case '+':
State=SqStack_Pop(S,Elem1);
State=SqStack_Pop(S,Elem2);
Elem1=Elem2+Elem1;
SqStack_Push(S,Elem1);
break;
case '-':
State=SqStack_Pop(S,Elem1);
State=SqStack_Pop(S,Elem2);
Elem1=Elem2-Elem1;
SqStack_Push(S,Elem1);
break;
case '*':
State=SqStack_Pop(S,Elem1);
State=SqStack_Pop(S,Elem2);
Elem1=Elem2*Elem1;
SqStack_Push(S,Elem1);
break;
case '/':
State=SqStack_Pop(S,Elem1);
State=SqStack_Pop(S,Elem2);
Elem1=Elem2/Elem1;
SqStack_Push(S,Elem1);
break;
default:
SqStack_Push(S,Rear[i]-'0');
}
}
State=SqStack_Pop(S,Elem1);
Result=Elem1;
}
int main()
{
int State,Result;
char Mid[256],Rear[256];
while(1)
{
system("cls");
printf("现阶段由于程序比较LOW,请按注意事项输入:\n1.所有输入均是在英文状态下输入\n2.输入时数字仅限一位整数进行运算\n");
printf("请输入中缀:");
gets(Mid);
State=Mid_Rear(Mid,Rear);
if(State==ERROR)
printf("表达式错误!\n");
else
{
printf("表达式正确!\n");
printf("后缀:%s\n",Rear);
Caculation(Rear,Result);
printf("结果:%d\n",Result);
}
system("pause");
}
return 0;
}