数据结构-算术表达式求值

#include<stdio.h>
#define ERROR 0
#define OK 1
#define STACKINCREAMENT 10
#define STACK_INT_SIZE 100
#define OVERFLOW -2
typedef int status;
typedef char SElemtype;
#include<malloc.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include<windows.h>

typedef struct{
SElemtype *base;
SElemtype *top;
status stacksize;
}sqstack;

typedef struct{
int *base;
int *top;
status stacksize;
}whstack;

void init(sqstack *s){
s->base=(SElemtype*)malloc(STACK_INT_SIZE*sizeof(SElemtype));
if(!s->base) exit(OVERFLOW);
s->top=s->base;
s->stacksize=STACK_INT_SIZE;
}

void Seinit(whstack *s){
s->base=(int*)malloc(STACK_INT_SIZE*sizeof(int));
if(!s->base) exit(OVERFLOW);
s->top=s->base;
s->stacksize=STACK_INT_SIZE;
}
char gettop(sqstack *s,SElemtype *e){
if(s->top==s->base)
return ERROR;
e=s->top-1;
return *e;
}

status Segettop(whstack *s,int *e){
if(s->top==s->base)
return ERROR;
e=s->top-1;
return *e;
}
void push(sqstack *s,SElemtype e){

if(s->top-s->base>=s->stacksize){
s->base = (SElemtype*)realloc(s->base,(s->stacksize+STACKINCREAMENT)*sizeof(SElemtype));
if(!s->base) exit(OVERFLOW);
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREAMENT;}
*s->top++=e;
}

void Sepush(whstack *s,SElemtype e){

if(s->top-s->base>=s->stacksize){
s->base = (int*)realloc(s->base,(s->stacksize+STACKINCREAMENT)*sizeof(int));
if(!s->base) exit(OVERFLOW);
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREAMENT;}
*s->top++=e;
}

status pop(sqstack *s,SElemtype *e){
if(s->top==s->base) return ERROR;
*e=*--s->top;
return OK;




}
status Sepop(whstack *s,int *e){
if(s->top==s->base)
return ERROR;
*e=*--s->top;
return OK;


}

int char_to_num(char s){
if(s>=49&&s<=57){
s=s-48;
return s;


}
else
return 0;

}

char precede(char a,char b){
int i,j;
char compare[8][8]={' ','+','-','*','/','(',')','#',
'+','>','>','<','<','<','>','>',
'-','>','>','<','<','<','>','>',
'*','>','>','>','>','<','>','>',
'/','>','>','>','>','<','>','>',
'(','<','<','<','<','<','>',' ',
')','>','>','>','>',' ','>','>',
'#','<','<','<','<','<',' ','=',
};

for(i=0;i<8;i++)
if(compare[0][i]==a) break;
for(j=0;j<8;j++)
if(compare[j][0]==b) break;

return compare[j][i];



}
int operate(int a,char x,int c){
int y;
switch(x)
{
case '+':y=a+c;break;
case '-':y=a-c;break;

case '*':y=a*c;break;
case '/':y=a/c;break;

default:return 0;break;
}

return y;

}

int evaluateexpression(){


char c[100];
sqstack OPTR;
whstack OPND;
int a,b,d,i=0;
char x,theta,ch,y;
init(&OPTR);

push(&OPTR,'#');
Seinit(&OPND);



printf("请输入表达式(以#结尾): ");
scanf("%s",c);



while(1){



if(char_to_num(c[i]))
{


Sepush(&OPND,char_to_num(c[i++]));


}else if(c[i]=='+'||c[i]=='-'||c[i]=='*'||c[i]=='/'||c[i]=='('||c[i]==')'||c[i]=='#')
{



switch(precede(c[i],gettop(&OPTR,&ch)))

{


case '<':push(&OPTR,c[i++]);break;

case '=':pop(&OPTR,&x);break;
case '>':pop(&OPTR,&theta);
Sepop(&OPND,&b);
Sepop(&OPND,&a);
Sepush(&OPND,operate(a,theta,b)); break;

default:break;
}


}

if(c[i]=='#'&&gettop(&OPTR,&y)=='#'){



printf("结果=%d ",Segettop(&OPND,&d));
return OK;

}


}
}

int main(){


printf(" 算术表达式求值 ");

evaluateexpression();
getch();


}

原文地址:https://www.cnblogs.com/xufeng123/p/7822602.html