#include
#include
#define thestacksize 100
#define stackincrement 10
#define overflow -1
#define ok 1
#define error 0
typedef struct{
char top;
char *base;
int stacksize;
}sqstack;
int initstack(sqstack s){
s.base=(char)malloc(thestacksize*sizeof(char));
if(!s.base)exit(overflow);
s.top=s.base;
s.stacksize=thestacksize;
return ok;
}
int gettop(sqstack s){
char e;
if(s.top==s.base)return error;
e=*(s.top-1);
return ok;
}
int push(sqstack s,char e){
if(s.top-s.base>=s.stacksize){
s.base=(char*)realloc(s.base,(s.stacksize+stackincrement)*sizeof(char));
if(!s.base)exit(overflow);
s.top=s.base+s.stacksize;
s.stacksize+=stackincrement;
}
s.top++=e;
return ok;
}
int pop(sqstack s,char e){
if(s.top==s.base)return error;
e=--s.top;
return ok;
}
char precede(char p1,char p2){
char p[7][7] = {{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'<', '<', '<', '<', '<', '=', ' '},
{'>', '>', '>', '>', ' ', '>', '>'},
{'<', '<', '<', '<', '<', ' ', '='}};
int r,l;
switch(p1){
case'+':
r=1;
break;
case'-':
r=2;
break;
case'*':
r=3;
break;
case'/':
r=4;
break;
case'(':
r=5;
break;
case')':
r=6;
break;
case'#':
r=7;
break;
default:
break;
}
switch(p2){
case'+':
l=1;
break;
case'-':
l=2;
break;
case'*':
l=3;
break;
case'/':
l=4;
break;
case'(':
l=5;
break;
case')':
l=6;
break;
case'#':
l=7;
break;
default:
break;
}
return (p[r][l]);
}
int ifoptr(char c){
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')return ok;
else return error;
}
int operate(int a,char p,int b){
if(p=='+')return(a+b);
else if(p=='-')return(a-b);
else if(p=='*')return(a*b);
else return(a/b);
}
int evaluateexpression(){
char p,c;
int a,b;
sqstack optr;
sqstack opnd;
initstack(optr);
initstack(opnd);
push(optr,'#');
c=getchar();
while(c!='#'||gettop(optr)!='#'){
if(!ifoptr(c)){push(opnd,c);c=getchar();}
else
switch(precede(gettop(optr),c)){
case'<':
push(optr,c);
c=getchar();
break;
case'=':
pop(optr,p);c=getchar();
break;
case'>':
pop(optr,p);
pop(opnd,a);
pop(opnd,b);
push(opnd,operate(a,p,b));
break;
default:
break;
}
}
return gettop(opnd);
}
int main() {
char e;
printf("input an expression (end with '#'):\n");
e=evaluateexpression();
printf("result:\n");
printf("%d\n",e);
}
表达式求值的程序,编译可以通过,运行后就项目停止运行了,看了很久到底哪里除了问题??求教,谢谢各位了~