表达式求值问题

说明:

表达式求值的特色就是运用了两个栈,分别为运算符栈和运算数栈,两个栈一起使用完成了表达式求值运算,要特别小心运算符的优先级,学习了书上关于算符优先级的表格以及在各种情况下分类讨论的情况注意不要遗漏情况,不要弄错出栈入栈的顺序

#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;
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值