求助!!表达式求值,程序已写好,但是运行不了求指导
程序已写好 没有错误提示 但是运行的时候会弹出一个窗口要求中止程序的运行只有一些警告
怀疑红字部分错了 因为输入的时候第一个字符#没有进栈
除了第一个外其他都会进栈 调试的时候 就是到了红字部分时
系统要求中止程序运行
求指点!!!
#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 编辑 ]