求解答~program received signal sigsegv,segmentation fault,为什么会这样?
程序代码:
#include<stdio.h> #include<stdlib.h> #include<string> /*表达式求值 问题描述:使用键盘输入表达式,计算表达式的值并输出; 将表达式转化成后缀表达式输出,利用后缀表达式求表达式的值并输出。 测试数据: 3*(7-2) 2*(6+2*(3+6*(6+6)))+(6+6)*3+2 8/(9-9) */ #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef struct{ char *base; char *top; int stacksize; }Sqstack; typedef struct{ int *base; int *top; int stacksize; }Sqstack_int; void InitStack (Sqstack &S){ //创建一个空栈char型S S.base = (char *) malloc (STACK_INIT_SIZE * sizeof(char)); if(!S.base) exit(-1);//申请内存失败 S.top=S.base; S.stacksize=STACK_INIT_SIZE; } void InitStack_Int (Sqstack_int &S){ //创建一个空栈int型S S.base = (int *) malloc (STACK_INIT_SIZE * sizeof(int)); if(!S.base) exit (-1);//申请内存失败 S.top=S.base; S.stacksize=STACK_INIT_SIZE; } int GetTop (Sqstack S,char &e){ //若栈不为空,则用e返回S的栈顶元素,并返回1,否则返回0 if(S.top==S.base) return 0; e=*(S.top-1); return 1; } int GetTop_Int (Sqstack_int S,int &e){ //若栈不为空,则用e返回S的栈顶元素,并返回1,否则返回0 if(S.top==S.base) return 0; e=*(S.top-1); return 1; } void Push_int(Sqstack_int &S,int e){ //插入元素e作为新的栈顶元素 if(S.top-S.base>=S.stacksize){//满栈,追加存储空间 S.base = (int *) realloc (S.base,(S.stacksize+STACKINCREMENT) *sizeof(int)); if(!S.base) exit (-1);//申请空间失败 S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top++=e; } void Push(Sqstack &S,int e){ //插入元素e作为新的栈顶元素 if(S.top-S.base>=S.stacksize){//满栈,追加存储空间 S.base = (char *) realloc (S.base,(S.stacksize+STACKINCREMENT) *sizeof(char)); if(!S.base) exit (-1);//申请空间失败 S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top++=e; } char Pop(Sqstack &S,char &e){ //若栈不为空,则删除S的栈顶元素,并用e返回其值,并返回1,否则返回0 if (S.top == S.base) printf("empty"); e = *--S.top; return e; } int Pop_Int(Sqstack_int &S,int &e){ //若栈不为空,则删除S的栈顶元素,并用e返回其值,并返回1,否则返回0 if (S.top == S.base) printf("empty"); e = *--S.top; return e; } int Output(char* c){ char s; c++; s=*c; while(s!='#') printf("%c",s); return 1; } char Precede(char c,char d){ if (c=='('&&d==')') return '='; if (c==d) { if(c!='('&&c!='#') return '>'; else return '='; } if (c=='*'||c=='/') { if(d=='(') return '<'; else return '>'; } if (c=='+'||c=='-') { if (d=='*'||d=='/'||d=='(') return '<'; if (d=='+'||d=='-'||d==')'||d=='#') return '>'; } if (c==')'&&d!='(') return '>'; if ((c=='('&&d=='#')||(c==')'&&d=='(')||(c=='#'&&d==')')) return 0; if ((c=='('||c=='#')&&(d!=')')) return '<'; return 0; } int Isopertor(char c){ char *p="#/*+-"; while(*p){ if(*p==c) return 1; p++; } return 0; } char* Sort(char* p){ Sqstack OPTR,OPRE; char c,e,x,l; InitStack(OPTR); Push(OPTR,'#'); InitStack(OPRE); c=*p; while (c!='#'||(GetTop(OPRE,l)!=1)||l!='#'){ if(!Isopertor(c)){ Push(OPRE,c); p++; break; } else{ GetTop(OPRE,l); switch(Precede(l,c)){ case'<': Push(OPTR,c); p++; break; case'=': Pop(OPTR,x);p++; break; case'>': Pop(OPTR,e); Push(OPRE,e); break; } } } Push(OPTR,'#'); return OPRE.base; } char Operator(char m,char n,char c){ int a,b;char finall; a=atoi(&m);b=atoi(&n); int result; if(c=='+') result=a+b; if(c=='-') result=a-b; if(c=='*') result=a*b; if(c=='/') { if(b==0) {printf("分母不能为零"); return 0;} else result=a/b; } finall='0'+result; return finall; } char Evaluate(char *p){ Sqstack OPTR,OPRE; char c,e,x,a,b;int l,m; InitStack(OPTR); Push(OPTR,'#'); InitStack(OPRE); c=*p; while (c!='#'||GetTop(OPRE,c)!=0){ if(!Isopertor(c)){ Push(OPRE,c); p++; break; } else switch(Precede(GetTop(OPRE,e),c)){ case'<': Push(OPTR,c); p++; break; case'=': Pop(OPTR,x);p++; break; case'>': Pop(OPTR,e); Pop(OPRE,b);Pop(OPRE,a); Push(OPRE,Operator(a,b,e)); break; } } GetTop(OPRE,c); return c; } int Evaluate_P(char *p){ Sqstack_int S; char a,a1,a2,k;int m,n,l; if(!Isopertor(*p)) { Push_int(S,atoi(p)); p++; } else { Pop_Int(S,n);Pop_Int(S,m); a=*p; a1='0'+m;a2='0'+n; k=Operator(a1,a2,a); l=atoi(&k); Push_int(S,l); } GetTop_Int(S,l); return l; } int main(){ char *p;char *l; printf("请输入表达式以#结束:"); gets(p); printf("表达式求值:"); puts(p); printf("=%s\n",Evaluate(p)); printf("\n"); printf("后缀表达式:"); l=Sort(p); Output(l); printf("="); Evaluate_P(l); return 0; }