char EvaluateExpression(){//表达式求值
SqStack OPND,OPTR;
SElemType theta,a,b,e;
int count=0;
Initstack(&OPND);
Initstack(&OPTR);
Push(&OPTR,'#');
printf("Input the expression:");
char c=getchar();
GetTop(OPTR,&e);
while(c!='#'||e!='#'){//两个井号相遇则运算结束
if(index(c)==7){
if(count==0){
Push(&OPND,c);
count=1;
}else{
Pop(&OPND,&theta);
int i=theta-48;
c=i*10+c;
Push(&OPND,c);
}
c=getchar();
GetTop(OPTR,&e);
}
else{
count=0;
GetTop(OPTR,&e);
switch(Precede(e,c)){
case '<':
Push(&OPTR,c);
c=getchar();
GetTop(OPTR,&e);
break;
case '=':
Pop(&OPTR,&theta);
c=getchar();
GetTop(OPTR,&e);
break;
case '>':
Pop(&OPTR,&theta);
Pop(&OPND,&b);
Pop(&OPND,&a);
Push(&OPND,Operate(a,theta,b));
GetTop(OPTR,&e);
break;
case '!':
return ERROR;
}
}
}
GetTop(OPND,&e);
return e;
}
核心算法如图所示,基本思想是利用栈的基本性质和操作(数栈和算符栈两栈分开),结合算符优先级顺序的二维数组定义,完成基本算数表达式的核心算法结构的代码。
但是该算法存在一个很大的问题,即数栈采用了char型为基本单位,这就导致了在顺序栈中可以存放的数值大小十分有限,稍微大一点的数都无法计算,所以考虑采用将数栈中的元素以int型进行存储,但是这又导致了定义的所有栈的基本操作需要写两遍,才能匹配上不同类型的元素进行操作。两种方法都有弊端。