要计算多项式的值,所以建立了两个栈,一个用来存储数据,一个用来存储运算符,转化成后缀表达式后再计算,关于后缀表达式可以百度一下;
因此代码如下:

#include<stdio.h>
#include<stdlib.h>
 
# define MAXSIZE 1024
 
struct st
{
char num[MAXSIZE];
int top;
};
 
typedef struct st Stack;
 
Stack *init()
{
Stack *s;
s=(Stack *)malloc(sizeof(Stack));
s->top=-1;
return s;
}
 
int push(Stack *s,char n)
{
if(s->top==MAXSIZE-1)
return 0;
else
{
s->top++;
s->num[s->top]=n;
return 1;
}
}
 
int main()
{
Stack *s,*s1;
int i=0,sum,sign,a[2014],j,each,last;
char i_n[1024];
gets(i_n);
s=init();
s1=init(); //生成两个栈;
if(push(s1,'(')==0)
exit(0);
sign=0;
for(i=0;i_n[i]!='@';i++)
{
while(i_n[i]=='+'||i_n[i]=='-')
{
sign=1;
if(s1->num[s1->top]=='('||s1->num[s1->top]=='+'||s1->num[s1->top]=='-')
{
push(s1,i_n[i]);
break;
}
else
{
push(s,s1->num[s1->top]);
s1->top--;
}
}
if(i_n[i]=='*'||i_n[i]=='/'||i_n[i]=='(')
{
sign=1;
push(s1,i_n[i]);
}
if(i_n[i]==')')
{
sign=1;
while(s1->num[s1->top]!='(')
{
push(s,s1->num[s1->top]);
s1->top--;
}
s1->top--;
}
if(i_n[i]>='0'&&i_n[i]<='9')
{
if(sign==1)
push(s,' ');
push(s,i_n[i]);
sign=0;
}
 
} //生成了后缀表达式
for(i=s1->top;i>0;i--)
push(s,s1->num[i]);
j=0;
sum=1;
each=0;
last=0;
for(i=0;i<=s->top;i++)
{
while(s->num[i]>='0'&&s->num[i]<='9')
{
each*=sum;
each+=s->num[i]-'0';
sum*=10;
i++;
}
if(each!=0)
a[j++]=each;
sum=1;
each=0;
if(!(s->num[i]>='0'&&s->num[i]<='9')&&s->num[i]!=' ')
{
if(s->num[i]=='+')
{
last=a[j-2]+a[j-1];
}
if(s->num[i]=='-')
{
last=a[j-2]-a[j-1];
}
if(s->num[i]=='*')
{
last=a[j-2]*a[j-1];
}
if(s->num[i]=='/')
{
last=a[j-2]/a[j-1];
}
a[j-2]=last;
j--;
}
}
 
printf("%d\n",last);
return 0;
}
方法拙劣,敬请见谅。。。

发表评论

电子邮件地址不会被公开。

Post Navigation