您的位置:首页 > 其它

NYOJ 35 表达式求值

2012-08-03 07:55 351 查看
#include<stdio.h>
#include<stdlib.h>
#define N 1010
char s
;
//字符栈的操作
typedef struct
{
char *base;
char *top;
}SqStack1;
int InitStack1(SqStack1 &S)
{
S.base=(char *)malloc(N*sizeof(char));
if(!S.base)  exit(1);
S.top=S.base;
return 1;
}
int StackEmpty1(SqStack1 &S)
{
if(S.top==S.base)
return 1;
return 0;
}
char GetTop1(SqStack1 S)
{
char e;
if(S.top==S.base)  return 0;
e=*(S.top-1);
return e;
}
int Push1(SqStack1 &S,char e)
{
*S.top++=e;
return 1;
}
int Pop1(SqStack1 &S,char &e)
{
if(S.top==S.base)  return 0;
e=*--S.top;
return 1;
}
//数字栈的操作
typedef struct
{
float *base;
float *top;
}SqStack2;
int InitStack2(SqStack2 &S)
{
S.base=(float *)malloc(N*sizeof(float));
if(!S.base)  exit(1);
S.top=S.base;
return 1;
}
int StackEmpty2(SqStack2 &S)
{
if(S.top==S.base)
return 1;
else return -1;
}
float GetTop2(SqStack2 S)
{
float e;
if(S.top==S.base)  return 0;
e=*(S.top-1);
return e;
}
int Push2(SqStack2 &S,float e)
{
*S.top++=e;
return 1;
}
int Pop2(SqStack2 &S,float &e)
{
if(S.top==S.base)  return 0;
e=*--S.top;
return 1;
}
//转化的操作过程
float Operate(float a,char theta,float b)
{
switch(theta)
{
case '+': return a+b;
case '-': return a-b;
case '*': return a*b;
case '/': return a/b;
default: return 0;
}
}
int level(char c,int i)
{
switch(c)
{
case '=': return 1;
case ')': return i?2:5;
case '+':
case '-': return 3;
case '*':
case '/': return 4;
case '(': return i?5:2;
default : return 0;
}
}
char Precede(char c1,char c2)
{
int k=(c1=='('&&c2=='=')||(c1=='='&&c2==')')||(c1==')'&&c2=='(');
if(!k)
{
if(c1=='('&&c2==')') return '=';
else
{
if(level(c1,0)<level(c2,1)) return '<';
else return '>';
}
}
return 0;
}
float Evaluateexpression_r()
{
SqStack1 OPTR; SqStack2 OPND;
char theta,c,x; float a,b,k,t; char *p1,*p=s;
InitStack1(OPTR); Push1(OPTR,'=');
InitStack2(OPND); c=*p;
while(c!='='||GetTop1(OPTR)!='=')
{
if(!level(c,1))
{
for(t=k=0;!level(c,1)&&c!='.';c=*++p)  //之前的提交错在这里,t应在这里清0,防止上次数据被多读
k=10*k+c-'0';
if(c=='.')
{
while(!level(*++p,1)); c=*p;
for(p1=p-1;*p1!='.';p1--)   //原先我把t放在这个for()语句中,导致出错!
t=0.1*t+*p1-'0';
t*=0.1;
}
Push2(OPND,k+t);  //应为这里是k+t
}
else
switch(Precede(GetTop1(OPTR),c))
{
case'<': Push1(OPTR,c);c=*++p;break;
case'=': Pop1(OPTR,x); c=*++p;break;
case'>':
Pop1(OPTR,theta);
Pop2(OPND,b); Pop2(OPND,a);
Push2(OPND,Operate(a,theta,b));
}
}
return GetTop2(OPND);
}
//主函数
int main()
{
int n;
scanf("%d%*c",&n);
while(n--)
{
gets(s);
printf("%.2f\n",Evaluateexpression_r());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: