算术表达式求值的运算符优先算法。C语言完整代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
# define TRUE 1
# define FALSE 0
typedef int Status;
typedef char SElemType;
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
}StackChar; //sequence序列
typedef struct {
float *base;
float *top;
int stacksize;
}StackFloat; //sequence序列
Status InitStack(StackChar **S){
//初始化空桟
*S=(StackChar *)malloc(sizeof(StackChar));
(*S)->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!(*S)->base) exit(OVERFLOW);
(*S)->top=(*S)->base;
(*S)->stacksize=STACK_INIT_SIZE;
return OK;
}// InitStack(&S);
Status initStack(StackFloat **S){
//初始化空桟
*S=(StackFloat *)malloc(sizeof(StackFloat));
(*S)->base=(float *)malloc(STACK_INIT_SIZE*sizeof(float));
if(!(*S)->base) exit(OVERFLOW);
(*S)->top=(*S)->base;
(*S)->stacksize=STACK_INIT_SIZE;
return OK;
}// initStack(&S);
Status Pop(StackChar **S,SElemType *a){
if((*S)->top==(*S)->base) {printf("ERROR!\n"); return ERROR; }
*a=*(--(*S)->top);
return OK;
}// Pop(&S,&e);
Status pop(StackFloat **S,float *a){
if((*S)->top==(*S)->base) {printf("ERROR!\n"); return ERROR; }
*a=*(--(*S)->top);
return OK;
}// Pop(&S,&e);
Status Push(StackChar *S,SElemType e){
*S->top++=e;
return OK;
}//Push(S,e);
Status push(StackFloat *S,float e){
*S->top++=e;
return OK;
}//push(S,e);
SElemType GetTop(StackChar S){
SElemType e;
e=*(S.top-1);
return e;
}//GetTop(*S,&e);
float getTop(StackFloat S){
float e;
e=*(S.top-1);
return e;
}//GetTop(*S,&e);
int InOP(char c){
//判断c是否为运算符,是返回TRUE,否则返回FALSE
switch (c){
case '+': return TRUE;
case '-': return TRUE;
case '*': return TRUE;
case '/': return TRUE;
case '(': return TRUE;
case ')': return TRUE;
case '#': return TRUE;
default: return FALSE;
}
}//InOP(b[2])
char precede(SElemType e,char c){
//判断e和c的优先级,若e的优先权小于c 返回'<'; ...'='; ...'>';
char OP[7]={'+','-','*','/','(',')','#'};
switch (e){
case '+':
if (c=='+'||c=='-'||c== ')'||c=='#') return '>';
else return '<';
case '-':
if (c=='+'||c=='-'||c== ')'||c=='#') return '>';
else return '<';
case '*':
if (c=='+'||c=='-'||c=='*'||c=='/'||c== ')'||c=='#') return '>';
else return '<';
case '/':
if (c=='+'||c=='-'||c=='*'||c=='/'||c== ')'||c=='#') return '>';
else return '<';
case '(':
if (c=='#') { printf("'('--'#':FALSE\n");break;}
else if (c=='+'||c=='-'||c=='*'||c=='/'||c=='(') return '<';
else return '=';
case ')':
if (c=='(') { printf("')'--'(':FALSE\n");break;}
else return '>';
case '#':
if (c==')') { printf("'#'--')':FALSE\n");break;}
else if (c=='#') return '=';
else return '<';
}
}
float Operate(float a,unsigned char theta, float b) {
switch(theta) {
case '+': return a+b;
case '-': return a-b;
case '*': return a*b;
case '/': return a/b;
default : return 0;
}
}
void EvaluateExpression(){
//只能算0-9的数之间的运算
int i;
StackChar *OPTR,o; // 运算符栈,字符元素
StackFloat *OPND,P; // 运算数栈,实数元素
char TempData[20];
float Data,a,b;
char oprtr,*c,x,Dr[2];
char MyExpression[]={'6','*','7','+','(','7','/','8','*','(','8','-','9',')','-','6',')','#'};//35.125
// char MyExpression[]={'6','*','7','+','(','7','/','8','*','(','8','-','9',')','-','16',')','#'};//还是35.125,因为'16'作为char型只保留了一位