计算表达式的程序,请大神们看看咋错的。。。。
#include <stdio.h>#include <STDLIB.H>
typedef struct nod//定义运算符节点
{
char data;
struct nod *next;
}stackl;
typedef struct
{
stackl *base;
stackl *top;
}sqstack;
typedef struct node//定义一个存放数字的节点
{
int data;
struct node *next;
}stacks;
typedef struct
{
stacks *base;
stacks *top;
}ysstack;
/*构造存放运算符和操作数的空栈*/
char initstack(sqstack *s)//构造一个存放运算符的空栈
{
s->base=(stackl *)malloc(50*sizeof(stackl));
if(!s->base) return 0;
s->top=s->base;
return 1;
}
int initstacks(ysstack *s)//构造一个存放操作数的空栈
{
s->base=(stacks *)malloc(50*sizeof(stackl));
if(!s->base) return 0;
s->top=s->base;
return 1;
};
/*构造进栈函数*/
char push(sqstack *s,char e)//运算符进栈
{
s->top->data=e;
s->top++;
return 1;
}
int pushs(ysstack *s,int e)//操作数进栈
{
s->top->data=e;
s->top++;
return 1;
}
/*构造出栈函数*/
char pop(sqstack *s)//运算符出栈
{
//s->top-1;
char e;
e=(s->top-1)->data;
s->top--;
return e;
}
int pops(sqstack *s)//操作数出栈
{
//s->top-1;
int e;
e=(s->top-1)->data;
s->top--;
return e;
}
/*构造获取栈顶元素的函数*/
char gettop(sqstack *s)//获取运算符栈顶元素
{
char e;
e=(s->top-1)->data;
return e;
}
int gettops(sqstack *s)//获取操作数栈顶元素
{
int e;
e=(s->top-1)->data;
return e;
}
char ysf(char b,char c)//检测操作符的优先级
{
switch(c)
{
case '+':
switch(b)
{
case '+':return '>';break;
case '-':return '>';break;
case '*':return '>';break;
case '/':return '>';break;
case '(':return '<';break;
case ')':return '>';break;
case '#':return '<';break;
}
case '-':
switch(b)
{
case '+':return '>';break;
case '-':return '>';break;
case '*':return '>';break;
case '/':return '>';break;
case '(':return '<';break;
case ')':return '>';break;
case '#':return '<';break;
}
case '*':
switch(b)
{
case '+':return '<';break;
case '-':return '<';break;
case '*':return '>';break;
case '/':return '>';break;
case '(':return '<';break;
case ')':return '>';break;
case '#':return '<';break;
}
case '/':
switch(b)
{
case '+':return '<';break;
case '-':return '<';break;
case '*':return '>';break;
case '/':return '>';break;
case '(':return '<';break;
case ')':return '>';break;
case '#':return '<';break;
}
case '(':
switch(b)
{
case '+':return '<';break;
case '-':return '<';break;
case '*':return '<';break;
case '/':return '<';break;
case '(':return '<';break;
case ')':return 0;break;
case '#':return '<';break;
}
case ')':
switch(b)
{
case '+':return '>';break;
case '-':return '>';break;
case '*':return '>';break;
case '/':return '>';break;
case '(':return '=';break;
case ')':return '>';break;
case '#':return 0;break;
}
case '#':
switch(b)
{
case '+':return '>';break;
case '-':return '>';break;
case '*':return '>';break;
case '/':return '>';break;
case '(':return 0;break;
case ')':return '>';break;
case '#':return '=';break;
}
}
}
int operate(int a,char b,int c)//对操作数进行运算
{
switch(b)
{
case '+':
return (a+c);
break;
case '-':
return (a-c);
break;
case '*':
return (a*c);
break;
case '/':
return (a/c);
break;
}
}
int evaluate()
{
char a,b,c,d,theta;
ysstack *shu=(stacks *)malloc(sizeof(stacks));
sqstack *fu=(stackl *)malloc(sizeof(stackl));
initstack(fu);
push(fu,'#');
initstacks(shu);
c=getchar();
while (c!='#'||gettop(fu)!='#')
{
if((c!='+')&&(c!='-')&&(c!='*')&&(c!='/')&&(c!='=')&&(c!='#')&&(c!='(')&&(c!=')'))
{
pushs(shu,c);
c=getchar();
}//如果不是操作数则进栈
else
switch(ysf(gettop(fu),c))
{
case'<':
push(fu,c);c=getchar();
break;
case'=':
pop(fu,gettop(fu));
c=getchar();
break;
case '>':
theta=pop(fu);
a=pops(shu);
b=pops(shu);
d=operate(a,theta,b);
pushs(shu,d);
break;
}
}
return gettops(shu);
}
int main()
{
int b;
printf("请输入运算式:\n");
b=evaluate();
printf("运算结果是:%d\n",b);
return 0;
}