| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 803 人关注过本帖
标题:求解答~program received signal sigsegv,segmentation fault,为什么会这样 ...
取消只看楼主 加入收藏
小mia同学
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-10-26
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:2 
求解答~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;
}
搜索更多相关主题的帖子: received 表达式 键盘 
2013-10-26 01:34
小mia同学
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-10-26
收藏
得分:0 
回复 2楼 Osiris9
这点不对吗?判断c是否为运算符,改了把p判空后,调试的时候还是会出现原来的问题。。
2013-10-26 01:54
小mia同学
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-10-26
收藏
得分:0 
回复 4楼 Osiris9
这个 函数没有什么问题。。
2013-10-26 15:03
快速回复:求解答~program received signal sigsegv,segmentation fault,为什么 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026252 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved