学习笔记------数据结构(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);
	}
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值