算术表达式求值的运算符优先算法。C语言完整代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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型只保留了一位

相关文档
最新文档