📄 evaluate.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 + -