您的位置:首页 > 其它

nyoj267 郁闷的C小加(二)

2012-08-02 08:37 218 查看
#include<stdio.h>
#include<stdlib.h>
#define N 1010
char s
;
int i;
//字符栈的操作
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/2*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 k)
{
switch(c){
case '=': return 1;
case ')': return k?2:5;
case '+':
case '-': return 3;
case '*':
case '/': return 4;
case '(': return k?5:2;
case ' ': return 6;
default : return 0;
}
}
int Precede(char c1,char c2)
{
if(level(c1,0)<level(c2,1)||c1=='='&&c2=='=') return 0;
return 1;
}
int Converse(char *s)
{
SqStack1 OPTR;
char ch,x,c=getchar();
InitStack1(OPTR);
Push1(OPTR,'=');
while(!StackEmpty1(OPTR)){
if(!level(c,1))
s[i++]=c;
else
switch(c){
case '(': Push1(OPTR,c);break;
case ')': Pop1(OPTR,ch);while(ch!='('){s[i++]=ch;Pop1(OPTR,ch);}break;
default : ch=GetTop1(OPTR);
while(Precede(ch,c)){
s[i++]=ch;
Pop1(OPTR,ch);
ch=GetTop1(OPTR);
}
if(c!='=')
Push1(OPTR,c);
break;
}
if(c!='='){
x=c;
c=getchar();
if(!level(x,1)&&level(c,1))
s[i++]=' ';
}
else{
Pop1(OPTR,ch);
s[i++]=ch;
}
}
s[i]='\0';
return 1;
}
float EvaluateExpression()
{
SqStack2 OPND;
InitStack2(OPND);
float k,t;
char *p1,*p=s;
char c=*p;
while(c!='='){
for(t=k=0;!level(c,1)&&c!='.';c=*++p)
k=10*k+c-'0';
if(c=='.'){
while(level(*++p,1)!=6);
c=*p;
for(p1=p-1;*p1!='.';p1--)
t=0.1*t+*p1-'0';
t*=0.1;
}
Push2(OPND,k+t);
c=*++p;
while(level(c,1)==3||level(c,1)==4){
Pop2(OPND,k);
Pop2(OPND,t);
Push2(OPND,Operate(t,c,k));
c=*++p;
}
}
return GetTop2(OPND);
}
//主函数
int main()
{
int j,n;
scanf("%d",&n);
while(n--){
getchar();
i=0;
Converse(s);
for(j=0;s[j];++j){
if(s[j]==' ') continue;
putchar(s[j]);
}
printf("\n%.2f\n",EvaluateExpression());
if(n) putchar('\n');
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: