请教高手,帮忙看看,这个程序哪里有错!编译时没错,运行时就有错了

功能是表达式求值
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
#include<math.h>
#include<string.h>
struct sqstack{
int data[100];
int top;
};
void init_stack(sqstack *s)
{s->top=-1;}
void push_stack(sqstack *s,char x)
{s->top++;
s->data[s->top]=x;}
void pop_stack(sqstack *s,int *x)
{*x=s->data[s->top];s->top--;}
int gettop(sqstack *s)
{return s->data[s->top];}
//------------------定义操作符-----------------

char op[8]={'(',')','+','-','*','/','^','%'};

//---------------判断是否是操作符-------------

int in(char c,char op1[])
{int i=0,j;
while(op1[i]=='/0')
{if(c==op1[i])
{j=1;}
else
j=0;
i++;}
return j;
}
//----------------栈外级别--------------------
int you1(char a)
{int i;
switch(a)
{case'+':i=1;break;
case'-':i=1;break;
case'/':i=2;break;
case'*':i=2;break;
case'^':i=4;break;
case'(':i=4;break;
case')':i=-1;break;}
return i;
}
//----------------栈内级别--------------------
int you(char a)
{int j;
switch(a)
{case'+':j=1;break;
case'-':j=1;break;
case'/':j=2;break;
case'*':j=2;break;
case'^':j=3;break;
case'(':j=-1;break;
case')':j=-1;break;}
return j;
}
//------------比较两个的优先级---------------
char precede(char s,char c)
{if(you(s)==you1(c))
return '=';
else if(you(s)>you1(c))
return '>';
else return'<';
}
//-------------根据运算计算数据--------------
int operate(int a1,int theta,int b1)
{int ans=0;
switch(theta)
{ case '+':ans=a1+b1; break;
case '-':ans=a1-b1; break;
case '*':ans=a1*b1; break;
case '/':ans=a1/b1;break;
case '^':ans=int(pow(a1,b1));break;}
return ans;
}
int transform(char s)//字符型数据转化为整形数据
{ int i;i=int(s);
return i;}
char evaluateexpression(char c)
{sqstack *optr,*opnd;
optr=(sqstack*)malloc(sizeof(sqstack));
opnd=(sqstack*)malloc(sizeof(sqstack));
int theta,x,a,b;
init_stack(optr);
push_stack(optr,'(');
init_stack(opnd);
c=getchar();
while(c!='#')
{if(!in(c,op))
{int i;
i=transform(c);
push_stack(opnd,i);c=getchar();}
else
switch(precede(gettop(optr),c))
{case'<':push_stack(optr,c);
c=getchar();
break;
case'=':if(c==')')
{pop_stack(optr,&x);
c=getchar();
break;}
case'>':pop_stack(optr,&theta);
pop_stack(opnd,&b);
pop_stack(opnd,&a);
push_stack(opnd,operate(a,theta,b));
break;}
}
if(gettop(optr)!='(')
{pop_stack(optr,&theta);
pop_stack(opnd,&b);
pop_stack(opnd,&a);
push_stack(opnd,operate(a,theta,b));
}
return gettop(opnd);
}
void main()
{char c;
cout<<"请输入表达式,并以#结束:"<<endl;
c=getchar();
cout<<evaluateexpression(c);
}

第1个回答  2009-04-18
貌似你的题目和我们做过的一个类似,给你看下我当时做的吧,运行没问题,不过只能进行简单的整形运算
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"

/*栈节点类型*/
typedef struct node
{
char data;
struct node *next;
}snode,*slink;
typedef struct node_post
{
int data;
struct node_post *next;
}pnode,*plink;

/*全局变量定义*/
slink top=NULL;
plink ptop=NULL;

/*栈空检测,空时为1*/
int Emptystack()
{
if(top==NULL)return 1;
else return 0;
}

/*出栈,返回top中data*/
char Pop()
{
char e;
slink p;
if(top==NULL)return(-1);
else
{
p=top;
top=top->next;
e=p->data;
free(p);
return e;
}
}
int Pop_post()
{
int e;
plink p;
if(ptop==NULL)return(-1);
else
{
p=ptop;
ptop=ptop->next;
e=p->data;
free(p);
return e;
}
}

/*进栈*/
void Push(char e)
{
slink p;
p=(slink)malloc(sizeof(snode));
p->data=e;
p->next=top;
top=p;
}
void Push_post(int e)
{
plink p;
p=(plink)malloc(sizeof(pnode));
p->data=e;
p->next=ptop;
ptop=p;
}

/*取栈顶*/
char Gettop()
{ if(!Emptystack(top))return (top->data);
else return 0;
}

/*符号优先级比较*/
int Precede(char x,char y)
{
int a,b;
switch(x)
{
case '#':a=-1;break; /*insert this line*/
case '(':a=0;break;
case '+':
case '-':a=1;break;
case '*':
case '/':a=2;break;
}
switch(y)
{
case '+':
case '-':b=1;break;
case '*':
case '/':b=2;break;
case '(':b=3;break;
}
if(a>=b)return 1;
else return 0;
}

/*中后续转换*/
void mid_post(char mid[],char post[])
{
int i=0,j=0;
char c;
Push('#');
do
{ c=mid[i++];
switch(c)
{
case '#':
{ while(!Emptystack())
post[j++]=Pop();
}break;
case ')':
{ while(Gettop()!='(')
post[j++]=Pop();
Pop();
}break;
case '+':
case '-':
case '*':
case '/':
case '(':
{ while(Precede(Gettop(),c))
post[j++]=Pop();
Push(c);
}break;
default:post[j++]=c;
}
}while(c!='#');

}

/*后缀表达式求值*/
void Postcount(char post[])
{ int i=0;
char x,a,b;
int z;
while(post[i]!='#')
{ x=post[i];
switch(x)
{
case '+':b=Pop_post();a=Pop_post();z=a+b;Push_post(z);break;
case '-':b=Pop_post();a=Pop_post();z=a-b;Push_post(z);break;
case '*':b=Pop_post();a=Pop_post();z=a*b;Push_post(z);break;
case '/':b=Pop_post();a=Pop_post();z=a/b;Push_post(z);break;
default:z=atoi(&x);Push_post(z);
}
i++;
}
if(ptop!=NULL)printf("The result is: %d",ptop->data);
else printf("Failure");
}

void main()
{
char post[255]=" ",mid[255]=" ";
char jj;int j=0;
do
{
printf("please enter expression(\"#\" as end):\n");
scanf("%s",mid);
printf("the expression eaual:\n");
mid_post(mid,post);
printf("%s\n",post);
Postcount(post);
getchar();
printf("\ncontinue?(y/n)\n");
jj=getchar();
switch (jj)
{
case 'y':j=1;top=NULL;ptop=NULL;return(main());
case 'n':
default:j=0;
}
}while(j);
}本回答被提问者采纳
第2个回答  2009-04-17
while(op1[i]=='/0') 这句你揣摩一下 是while(op1[i])才对
char op[8]={'(',')','+','-','*','/','^','%'}; 你看看是否是9而不是8
你这个算法本身有问题 但是运行出错是我说的那俩处 你回去再改改
相似回答