表达式求值代码不知道哪里出错了,帮忙看一下
这是一个表达式求值的代码,函数功能都差不多了,可是不知道为什么老是报很奇怪的错,我感觉是健壮性不好,可是不知道怎么改,请大家帮忙看一下。#include<stdio.h>
#define maxsize 100
typedef char DataType;
typedef struct stackNode{
DataType data;
struct stackNode *next;
}StackNode;
typedef struct{
StackNode *top;
}LinkNode;
LinkNode *OPTR,*OPND;
void initStack(LinkNode *S){
S->top=NULL;
}
void push(LinkNode *S,DataType x)
{
StackNode *p=(StackNode*)malloc(sizeof(StackNode));
p->data=x;
S->top->next=p;
p->next=NULL;
}
DataType pop(LinkNode *S){
DataType x;
StackNode *p=S->top;
if(stackEmpty(S)) Error("the stack is empty\n");
x=p->data;S->top->next=p;
free(p);
return x;
}
DataType getTop(LinkNode *S){
return S->top->data;
}
int in(DataType c){
int i;
char OP[8] = {'+','-','*','/','^','#','(',')'};
for(i=0;i<8;i++){
if(c==OP[i]) break;
}
return 1;
}
DataType precede(DataType a,DataType b){
char w;
int i,j;
int t[8][8]={1,1,-1,-1,-1,-1,1,1,
1,1,-1,-1,-1,-1,1,1,
1,1,1,1,-1,-1,1,1,
1,1,1,1,-1,1,1,1,
1,1,1,1,1,-1,1,1,
-1,-1,-1,-1,-1,-1,0,2,
1,1,1,1,1,2,1,1,
-1,-1,-1,-1,-1,-1,2,0
};
switch(a){
case '+':i=0;break;
case '-':i=1;break;
case '*':i=2;break;
case '/':i=3;break;
case '^':i=4;break;
case '(':i=5;break;
case ')':i=6;break;
case '#':i=7;break;}
switch(b){
case '+':j=0;break;
case '-':j=1;break;
case '*':j=2;break;
case '/':j=3;break;
case '^':j=4;break;
case '(':j=5;break;
case ')':j=6;break;
case '#':j=7;break;}
if(t[i][j]==1) return'>';
else if (t[i][j]==0) return'=';
else if (t[i][j]==-1) return'<';
}
double operate(DataType a,DataType b,DataType c ){
double r;int i;
switch(b){
case '+': r=a+c;break;
case '-': r=a-c;break;
case '*': r=a*c;break;
case '/': r=a/c;break;
case '^': for(i=1;i<=c;i++) { r=1.00;r=r*a;}break;
}
return ;
}
double Cal(DataType *str){
DataType a,b;
DataType *p=*str;
initStack(OPTR); push(OPTR,'#');
initStack(OPND);
while(*p!='#' || getTop(OPTR)!='#'){
if (in(*p)) OPNDPush(OPND,*(p++));
else{
switch (Precede(GetTop(OPTR),*p)){
case '<': Push(OPTR,*(p++)-'0');
break;
case '=': Pop(OPTR,*(p++));
break;
case '>': Pop(OPTR);
b=Pop(OPND);
a=Pop(OPND);
Push(OPND,Operate(a,Pop(OPTR),b));
break;
}
}
}
return (double)getTop(OPND);
}
void main(){
DataType *str[maxsize];
printf("Please input your expression :/n");
for(i=0;i<maxsize;i++) if(&str[i]!='#') scanf("%c",&str[i]);
Cal(str);
printf("The last result is : %d",Cal(str));
}