| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 426 人关注过本帖
标题:求助!!表达式求值,程序已写好,但是运行不了求指导
取消只看楼主 加入收藏
约束小朋友
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2013-5-28
结帖率:85.71%
收藏
 问题点数:0 回复次数:0 
求助!!表达式求值,程序已写好,但是运行不了求指导
程序已写好 没有错误提示 但是运行的时候会弹出一个窗口要求中止程序的运行
只有一些警告
怀疑红字部分错了  因为输入的时候第一个字符#没有进栈
除了第一个外其他都会进栈  调试的时候 就是到了红字部分时
系统要求中止程序运行

求指点!!!

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100       //初始化时初始化空间的大小
#define STACKINCREMENT 10         //如果栈满了,自增加空间
#define OPSETSIZE 7               //算符长度为7

typedef struct{                   //运算符栈的结构体
   char *base;                    //栈底
   char *top;                     //栈顶
   int stacksize;                 //当前已分配的空间,不是指栈中元素个数
}Stack;

typedef struct{                    //操作数栈的结构体
   double *base;                   //栈底
   double *top;                    //栈顶
   int stacksize;                  //当前已分配的空间,不是指栈中元素个数
}Num;

int IniS(Stack S){                 //运算符栈初始化,栈空
   S.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
                                   //分配初始的存储空间
   if(!S.base)return 0;            //若申请空间失败,返回0
   S.top=S.base;                   //当栈顶等于栈底,栈空
   S.stacksize=STACK_INIT_SIZE;    //算符栈最大的长度为100
   return 1;
}
int IniN(Num N){                    //操作数栈初始化
   N.base=(double*)malloc(STACK_INIT_SIZE*sizeof(double));
                                    //分配初始的存储空间
   if(!N.base)return 0;             //若申请空间失败,返回0
   N.top=N.base;                    //当栈顶等于栈底,栈空
   N.stacksize=STACK_INIT_SIZE;     //算符栈最大的长度为100
   return 1;
}

int Push(Stack S,char x){           //运算符栈,进栈
    if(S.top-S.base>=S.stacksize){
                                    //当栈的长度超过规定的最大长度S.stacksize时,需申请额外的存储空间
     S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
     if(!S.base)return 0;
                                    //若申请空间失败,返回0
     S.top=S.base+S.stacksize;
                                    //申请额外空间之前栈顶的位置S.top为S.base+S.stacksize
     S.stacksize+=STACKINCREMENT;
                                    //申请额外空间之后栈的长度增加了STACKINCREMENT
    }  
     *S.top++=x;
                                     //若长度未超过规定最大长度S.stacksize,将元素x进栈
     return 1;
}
int Put(Num N,double x){             //操作数栈,进栈
   if(N.top-N.base>=N.stacksize){
                                     //当栈的长度超过规定的最大长度S.stacksize时,需申请额外的存储空间
     N.base=(double*)realloc(N.base,(N.stacksize+STACKINCREMENT)*sizeof(double));
     if(!N.base)return 0;
                                     //若申请空间失败,返回0
     N.top=N.base+N.stacksize;
                                     //申请额外空间之前栈顶的位置S.top为S.base+S.stacksize
     N.stacksize+=STACKINCREMENT;
                                     //申请额外空间之后栈的长度增加了STACKINCREMENT
    }  
     *N.top++=x;
                                     //若长度未超过规定最大长度S.stacksize,将元素x进栈
     return 1;
}

int Pop(Stack S,char x){             //运算符栈,出栈
    if(S.top==S.base){               //若空,返0
        printf("栈是空的,无法出栈!");
        return 0;
    }
   x=*--S.top;                       //不空,出栈
   return 1;
}
int Out(Num N,double x){             //操作数栈,出栈
    if(N.top==N.base){               //若空,返0
        printf("栈是空的,无法出栈!");
        return 0;
    }
   x=*--N.top;                       //不空,出栈
   return 1;
}

char Gettop(Stack S){                //运算符栈,取栈顶
    if(S.top==S.base){               //若空,返0
        printf("栈是空的,无法取栈顶!");
        return 0;
    }
   return *(S.top-1);                //返回栈顶算符元素
}
double Geton(Num N){                 //操作数栈,取栈顶
    if(N.top==N.base){               //若空,返0
        printf("栈是空的,无法取栈顶!");
        return 0;
    }
   return *(N.top-1);                //返回栈顶算符元素
}

                                     //算符优先表
    char OPSET[OPSETSIZE]={'+','-','*','/','(',')','#'};
    char Prior[7][7]={'>','>','<','<','<','>','>',
                      '>','>','<','<','<','>','>',
                      '>','>','>','>','<','>','>',
                      '>','>','>','>','<','>','>',
                      '<','<','<','<','<','=','0',
                      '>','>','>','>','0','>','>',
                      '<','<','<','<','<','0','='
    };   


double yunsuan(double x,char fuhao,double y){
                                     //运算并返回结果
    switch(fuhao){
    case'+': return x+y;
    case'-': return x-y;
    case'*': return x*y;
    case'/': return x/y;
    default:return 0;                 //没有的返回0
    }
}

int panduan(char Test,char *TestOp){  //判断是否为运算符
    int m=0;                  
    for(int i=0;i<OPSETSIZE;i++)      //将输入的字符与已知规定的字符进行比较
        if(Test==TestOp[i])
            m=1;               
        return m;
}

int ReturnOpOrd(char op,char *TestOp){//返回该算符在算符数组中的位置的函数
    int i;
    for(i=0;i<OPSETSIZE;i++)         //将输入的字符与已知规定的字符进行比较
        if(op==TestOp[i])
            return i;
        return 0;
}

char cmp(char aop,char bop){         //是运算符则要判断其与运算符栈栈顶元素的优先级
 
    return Prior[ReturnOpOrd(aop,OPSET)][ReturnOpOrd(bop,OPSET)];
   
}
double Expression(char *myExpression){                  //表达式的正确性判断函数,同时计算表达式
    Stack S;                         //设Stack运算符栈,字符元素
    Num N;                           //设Num运算符栈,字符元素
    char TempData[20];               //辅助字符数组
    double Data,a,b;                 
    char fuhao,*c,x,Dr[2];            //fuhao是算符,c,x均为字符串当前字符,Dr保存当前字符和结束符
    IniS(S);                         //初始化运算符栈
    Push(S,'#');                     //‘#’进入算符栈,作为表达式的第一个字符
    IniN(N);                         //初始化操作数栈
    c=myExpression;
    strcpy(TempData,"\0");           //把“\0”拷贝到TempData,将TempData置空
   
    while(*c!='#'||Gettop(S)!='#'){   //当字符串中的首字符和尾字符同时为#时,运算结束
        if(panduan(*c,OPSET)==0){       //若当前字符是操作数
        Dr[0]=*c;                     //保存当前字符
        Dr[1]='\0';                  //保存字符串的结束符
        strcat(TempData,Dr);         //将当前c和结束符‘\0’连接到TempData中,形成字符串
        c++;
        if(panduan(*c,OPSET)==1){        //考虑到操作数不止1位,如果遇到运算符,则将字符串TempData转换成实数,入栈,并重新置空
        Data=(double)atof(TempData); //atof函数是将当前字符串转换成浮点型数据
        Put(N,Data);                 //Data进入操作数栈
        strcpy(TempData,"\0");
        }
        }
        else {                       //若当前字符是算符
            switch(cmp(Gettop(S),*c)){//获取当前算符栈的栈顶字符,与c比较优先级,进行运算
                  case '<':Push(S,*c);//c入算符栈
                           c++;
                           break;
                  case '=':Pop(S,x); //当前字符出算符栈
                           c++;
                           break;
                  case '>':Pop(S,fuhao);//将栈顶算符出栈
                           Out(N,b);    //将栈顶操作数出栈
                           Out(N,a);    //将栈顶操作数出栈
                           Put(N,yunsuan(a,fuhao,b));//将运算结果入操作数栈
                           break;                 
                 }//switch
    }   
        }//while
    return Geton(N);
}
void main(){
    int x,t=0;
    double RESULT;
    char *myExpression,str[20];

    printf("请输入算是表达式,以#号开始,以#号结束!\n");

    getchar();
    gets(str);
    myExpression=str;
    printf("\n您输入的表达式是:\n");
    puts(myExpression);
    RESULT=Expression(myExpression);
    printf("%3lf\n",RESULT);
}

[ 本帖最后由 约束小朋友 于 2014-5-28 20:36 编辑 ]
搜索更多相关主题的帖子: include 表达式 空间 
2014-05-27 21:25
快速回复:求助!!表达式求值,程序已写好,但是运行不了求指导
数据加载中...
 
   



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

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