简单表达式求值

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型进行存储,但是这又导致了定义的所有栈的基本操作需要写两遍,才能匹配上不同类型的元素进行操作。两种方法都有弊端。

猜你喜欢

转载自blog.csdn.net/wangjingyihhh/article/details/83589062