⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 evaluate.h

📁 数据结构 输入表达式
💻 H
字号:
#include "stdio.h"
#include "Stack.h"
#include "string.h"


/******************判断字符是否运算符(包括界限符)*********************************************/

int InOPTR(char e){
	if(e=='+'||e=='-'||e=='*'||e=='/'||e=='('||e==')'||e=='#') return 1;
	else return 0;
}

/**************************算术运算**********************************************************/

int Operate(int a,char theta,int b){
	switch(theta){
	case '+':
		return a+b;
	case '-':
		return a-b;
	case '*':
		return a*b;
	case '/':
		return a/b;
	}
}

/*****************************优先级判断******************************************************/

char Precede(char a,char b){
	char str[7][7]={ 
		{'>','>','<','<','<','>','>'}, 
		{'>','>','<','<','<','>','>'},
		{'>','>','>','>','<','>','>'},
		{'>','>','<','<','<','>','>'},
		{'<','<','<','<','<','=',' '},
		{'>','>','>','>',' ','>','>'},
		{'<','<','<','<','<',' ','='}
	};
	char theta[7]={'+','-','*','/','(',')','#'};

	int i;
	int n1,n2;
	n1=n2=-1;
	for(i=0;i<7;i++){
		if(theta[i]==a)  {n1=i;break;}
	}
	for(i=0;i<7;i++){
		if(theta[i]==b)  {n2=i;break;}
	}
    
	return str[n1][n2];
}

/**********************************表达式求值*************************************************/

int EvaluteExpression(char str[]){
	SqStack1 OPTR;
	SqStack2 OPND;
	InitStack1(OPTR);   //运算符(包括界限符)栈
	InitStack2(OPND);   //操作数栈

	Push1(OPTR,'#');
	printf("\n");
	
	printf("栈的变化过程:\n");
	printf("-----------------------------------------------------------------------------\n");
	printf("步骤\t");	
	printf("OPTR栈\t\t\t");
	printf("OPND栈\t\t\t");
	printf("输入元素\n");
	printf("-----------------------------------------------------------------------------\n");
	
	int i=1;  
	int t=1;
	int s;
	int length;
	length=strlen(str);
	while(str[i]!='#'||GetTop1(OPTR)!='#'){
		printf(" %d\t",t);
		t++;
		PrintElement1(OPTR);
		PrintElement2(OPND);
		for(s=i;s<length;s++){
			printf("%c",str[s]);
		}
		printf("\n");   

		
		if(!InOPTR(str[i]))
		{
			int sum;               //用于求操作数(操作数不一定是一位数)
			sum=int(str[i]-48);    //将字符转换为整型数
			i++;
			while(!InOPTR(str[i]))
			{
				sum=sum*10+int(str[i]-48);
				i++;
			}
			Push2(OPND,sum);
		}
		else
			switch(Precede(GetTop1(OPTR),str[i])){
			case '<':
				Push1(OPTR,str[i]);
				i++;
				break;
			case '=':
				char e;
				Pop1(OPTR,e);
				i++;
				break;
			case '>':
				char theta;
				int a,b;
				Pop1(OPTR,theta);
				Pop2(OPND,b);
				Pop2(OPND,a);
				Push2(OPND,Operate(a,theta,b));
				break;
		}//switch	

	}//while
	
	printf(" %d\t",t);
	PrintElement1(OPTR);
	PrintElement2(OPND);
	printf("%c",str[i]);
	printf("\n");
	printf("-----------------------------------------------------------------------------\n");
	return GetTop2(OPND);
}//EvaluteExpression


/*********************************************************************************************************************
													end...
**********************************************************************************************************************/




			

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -