说明:
表达式求值的特色就是运用了两个栈,分别为运算符栈和运算数栈,两个栈一起使用完成了表达式求值运算,要特别小心运算符的优先级,学习了书上关于算符优先级的表格以及在各种情况下分类讨论的情况注意不要遗漏情况,不要弄错出栈入栈的顺序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Maxsize 5
typedef struct{
int *top;
int *base;
int stacksize;
}*SqStack;
SqStack Initiastack(SqStack S)
{
S->base=(int*)malloc(sizeof(int));
S->top=S->base;
S->stacksize=Maxsize;
}
int Push(SqStack S,int e)
{
if(S->top-S->base==S->stacksize)//栈满了
{
return 0;
}
e=*S->top;
S->top++;
return 1;
}
int Pop(SqStack S,int e)
{
if(S->base==S->top)
return 0;
else
{
S->top--;
*S->top=e;
}
return 1;
}
int Getstack(SqStack S,int e)
{
if(S->base==S->top)//栈空
{
return 0;
}
else
{
e=*(S->top-1);
return e;
}
}
int isopera(char c)//判断是否为运算符
{
switch(c)
{
case'+':
case'-':
case'*':
case'/':
case'(':
case')':
case'=':
return 1;
default:
return 0;
}
}
char Operatorcompare(char c1,char c2)//判断两符号的优先关系
{
int i,j;
char str[7][7]={
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','0'},
{'>','>','>','>','0','>','>'},
{'<','<','<','<','<','0','='},
};
switch(c1)
{
case'+':
{
i=0;
break;
}
case'-':
{
i=1;
break;
}
case'*':
{
i=2;
break;
}
case'/':
{
i=3;
break;
}
case'(':
{
i=4;
break;
}
case')':
{
i=5;
break;
}
case'=':
{
i=6;
break;
}
}
switch(c2){
case'+':
{
j=0;
break;
}
case'-':
{
j=1;
break;
}
case'*':
{
j=2;
break;
}
case'/':
{
j=3;
break;
}
case'(':
{
j=4;
break;
}
case')':
{
j=5;
break;
}
case'=':
{
j=6;
break;
}
}
return str[i][j];
}
int Operation(int factor1,char op,int factor2)
{
int result;
switch(op){
case'+':
{
result=factor1+factor2;
}
case'-':
{
result=factor1-factor2;
}
case'*':
{
result=factor1*factor2;
}
case'/':
{
result=factor1/factor2;
}
default:
return 0;
}
}
int fianloperation(SqStack OPTR,SqStack OPND){
// SqStack OPTR,OPND;//OPTR为运算符栈,OPND为运算数栈
char c;
int elem,a1,a2;
int number=0;
Push(OPTR,'#');
//c=getchar();
printf("%c",&c);
while(c!='#'||Getstack(OPTR,elem)!='#')
{
if(!isopera(c))//不是运算符
{
number=c-'0';
Push(OPND,number);
//c=getchar();
printf("%c",&c);
if('0'<=c&&c<='9')
{
Pop(OPND,elem);//出栈刚刚进栈的元素
number=number*10+(c-'0');
Push(OPND,number);
number=0;
//c=getchar();
printf("%c",&c);
}
}
else
{
switch(Operatorcompare(Getstack(OPTR,elem),c))//比较优先级
{
case'<'://新输入的算符优先级高,c进栈
{
Push(OPTR,c);
//c=getchar();
printf("%c",&c);
break;
}
case'='://优先级相同
{
Pop(OPTR,elem);
//c=getchar();
printf("%c",&c);
break;
}
case'>'://新输入的算法优先级低,栈顶元素优先级高
{
Pop(OPTR,elem);
Pop(OPND,a1);Pop(OPND,a2);
Push(OPND,Operation(elem,a2,a1));
}
}
}
}
return (Getstack(OPND,elem));
}
int main()
{
SqStack OPTR,OPND;
OPTR=Initiastack(OPTR);
OPND=Initiastack(OPND);
printf("%d\r\n",fianloperation(OPTR,OPND));
return 0;
}