#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define ElemType int
#define MAXSIZE 1000
typedef struct OptrStack{//定义运算符链栈 char otr; struct OptrStack *next; }OPtrStack;
typedef struct OPndStack{ float opnd; struct OPndStack *next; }OPndStack;
OPtrStack *Init_optr(OPtrStack *top){//初始化一个带有头结点的运算符链栈
top=(OPtrStack *)malloc(sizeof(OPtrStack));
top->next=NULL;
return top;
}
OPndStack *Init_opnd(OPndStack *top){//初始化一个带有头结点的运算符链栈
top=(OPndStack *)malloc(sizeof(OPndStack));
top->next=NULL; return top;
}
OPtrStack *Push_optr(OPtrStack *top,char e){//入栈操作
OPtrStack *p;
p=(OPtrStack *)malloc(sizeof(OPtrStack));
if(p==NULL){ printf("栈满");
} else
{
p->otr=e; p->next=top->next; top->next=p;
} return top;
}
OPndStack *Push_opnd(OPndStack *top,float e){//入栈操作 OPndStack *p;
p=(OPndStack *)malloc(sizeof(OPndStack));
if(p==NULL){ printf("栈满"); }
else{ p->opnd=e; p->next=top->next; top->next=p; }
return top; }
char Pop_optr(OPtrStack *top){ OPtrStack *p; ElemType e; p=top->next;
if(p==NULL){ printf("栈空"); }
else{ e=p->otr; top->next=p->next; free(p); }
return e; }
float Pop_opnd(OPndStack *top){ OPndStack *p; ElemType e; p=top->next;
if(p==NULL){ printf("栈空"); } e
lse{ e=p->opnd; top->next=p->next; free(p);
}
return e;
}
char Get_optr(OPtrStack *optr){ char otr; OPtrStack *p; if(p==NULL)
{ printf("栈已空"); }
else{ otr=p->otr; }
return otr;
}
int OpId(char op){
switch(op){
case '+':return 0;
case '-':return 1;
case '*':return 2;
case '/':return 3;
case '(':return 4;
case ')':return 5;
case '#':return 6;
}
}
char precede(int otrID,int exID){
char precede[7][7]=
{{'>','>','<','<','<','>','>'},//+
{'>','>','<','<','<','>','>'},//-
{'>','>','>','>','<','>','>'},//*
{'>','>','>','>','<','>','>'},///
{'<','<','<','<','<','=',' '},//(
{'>','>','>','>',' ','>','>'},//)
{'>','>','<','<','<',' ','='}};//#
return precede[otrID][exID]; }
float Opration(float ond2,char pre_op,float ond1){ float ond3; switch(pre_op)
{ case '+' : ond3=ond2+ond1; break;
case '-' : ond3=ond2-ond1; break;
case '*' : ond3=ond2*ond1; break;
case '/' : ond3=ond2/ond1; break; }
return ond3;
}
float MidExpression_Eval(char *ex){//中缀表达式函数 OPtrStack *optr; OPndStack *opnd; char otr,pre_op;
float ond1,ond2,ond3;
optr=Init_optr(optr);
opnd=Init_opnd(opnd);
optr=Push_optr(optr,'#');
while(*ex!='#'||Get_optr(optr)!='#'){
otr=Get_optr(optr);
switch(precede(OpId(otr),OpId(*ex))){
case '<' : Push_optr(optr,*ex); ex++; break;
case '=' : Pop_optr(optr); ex++; break;
case '>' : pre_op=Pop_optr(optr); ond1=Pop_opnd(opnd); ond2=Pop_opnd(opnd); ond3=Opration(ond2,pre_op,ond1); Push_opnd(opnd,ond3); break;
}
}
}
int main(){ OptrStack *OPND,*OPTR;//初始化一个运算数栈,一个运算符栈
char express[MAXSIZE];
char *ex; printf("输入中缀表达式:\n");
gets(express);
ex=express;
MidExpression_Eval(ex);
return 0;
}