学习笔记------数据结构(C语言版)栈应用 表达式求值

//main.cpp

#include "predefined.h"
#include "SqStack.h"

SElemType EvaluateExpression();
SElemType GetTop_OPTR(SqStack S);
Status In(SElemType c);
SElemType Precede(SElemType c1,SElemType c2);
SElemType Operate(SElemType a,SElemType c,SElemType b);


int main()
{
	SElemType result;
	printf("请输入表达式:");
	result=EvaluateExpression();
	printf("=%c",result);
	return 0;
}

SElemType EvaluateExpression()
//算术表达式求值的算符优先算法。设OPTR和OPND分别为运算符栈和运算数栈,
//OP为运算符集合。
{
	SqStack OPTR,OPND;
	InitStack(&OPTR);
	InitStack(&OPND);
	Push(&OPTR,'#');
	SElemType a,b,c,d;
	c=getchar();
	while(c!='#'||GetTop_OPTR(OPTR)!='#')
	{
		if(!In(c))
		{
			Push(&OPND,c);
			c=getchar();
		}
		else
		{
			switch(Precede(GetTop_OPTR(OPTR),c))
			{
			case '>':Pop(&OPTR,&d);
				Pop(&OPND,&b);
				Pop(&OPND,&a);
				Push(&OPND,Operate(a,d,b));
				break;
			case '<':Push(&OPTR,c);c=getchar();break;
			case '=':Pop(&OPTR,&c);c=getchar();break;
			}
		}

	}
	return GetTop_OPTR(OPND);
}

SElemType GetTop_OPTR(SqStack S)
{
	if(StackEmpty(S)) return ERROR;
	return *((S).top-1);
}

Status In(SElemType c)
{
	switch(c)
	{
	case '+':
	case '-':
	case '*':
	case '/':
	case '(':
	case ')':
	case '#':return TRUE;
	default:return FALSE;
	}
}

SElemType Precede(SElemType c1,SElemType c2)
{
	SElemType f;
	switch(c1)
	{
	case '+':
	case '-':if(c2=='*'||c2=='/'||c2=='(') f='<';
			 else f='>';break;
	case '*':
	case '/':if(c2=='(') f='<';
		     else f='>';break;
	case '(':if(c2==')') f='=';
			 else if(c2=='#')
			 {
				 printf("输入错误!!!\n");
				 exit(ERROR);
			 }
			 else f='<';break;
	case ')':if(c2=='(')
			 {
					 printf("输入错误!!!\n");
					 exit(ERROR);
			 }
			 else f='>';
	case '#':if(c2==')')
			 {
				 printf("输入错误!!!\n");
				 exit(ERROR);
			 }
			 else if(c2=='#')
				 f='=';
			 else
				 f='<';
			 break;
	}
	return f;
}

SElemType Operate(SElemType a,SElemType c,SElemType b)
{
	SElemType x=a-48;
	SElemType y=b-48;
	switch(c)
	{
	case '+':return (x+y+48);
	case '-':return (x-y+48);
	case '*':return (x*y+48);
	case '/':return (x/y+48);
	}
}


你可能感兴趣的:(学习笔记---数据结构)