链栈的基本操作 三(中缀表达式 待优化)

#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;

}

猜你喜欢

转载自www.cnblogs.com/jiafeng1996/p/11324792.html