哪位高手能给出杭电ACM的第1237题的C程序代码,谢谢了

2025-02-25 00:25:26
推荐回答(3个)
回答1:

//很久没写纯C代码了,让我调试了好久
//代码支持括号
#include
#include
#include

char s[1005],t[1005],stackop[1005];
int p,sp,op;
double stack[1005];
double Operator(double x,char ops,double y)
{
switch(ops)
{
case'+':return x+y;
case'-':return x-y;
case'*':return x*y;
case'/':return x/y;
}
return 0;
}
char Priority(char op1,char op2)
{
if(((op1=='+'||op1=='-')&&(op2=='+'||op2=='-'||op2==')'||op2=='#'))||((op1=='*'||op1=='/')&&(op2=='+'||op2=='-'||op2=='*'||op2=='/'||op2==')'||op2=='#')))
return '>';
if((op1=='('&&op2==')')||(op1=='#'&&op2=='#'))
return '=';
else
return '<';
}
char Tonumber(char c)
{
double n=0;
if(isdigit(c))
{
while(isdigit(c))
{
n=n*10.+c-'0';
c=s[p++];
}
stack[sp++]=n;
}
return c;
}
int main()
{
double x,y;
char c,op1,op2,ops;
int i,j;

while(gets(t),strcmp(t,"0"))
{
sp=op=0;
stackop[op++]='#';

for(i=j=0;t[i];i++)
if(t[i]!=' ')
s[j++]=t[i];
s[j]=0;
p=strlen(s);
s[p]='#';
p=0;
c=s[p++];
while(c==' ')c=s[p++];
while(c!='#'||(op&&stackop[op-1]!='#'))
{
while(c==' ')c=s[p++];
c=Tonumber(c);
if(c!='+'&&c!='-'&&c!='*'&&c!='/'&&c!='('&&c!=')'&&c!='#')
c=s[p++];
else
{
op1=stackop[op-1];
op2=c;
switch(Priority(op1,op2))
{
case'<':
stackop[op++]=c;
c=s[p++];
break;
case'=':
op--;
c=s[p++];
break;
case'>':

ops=stackop[--op];
y=stack[--sp];
x=stack[--sp];
stack[sp++]=Operator(x,ops,y);
}
}
}
printf("%.2f\n",stack[sp-1]);
}
}

回答2:

数据结构(C语言版)栈一章中有啊;
那有算法,自己看算法, 就可以了;

回答3:

1237简单计算器代码,
#include
int main()
{
int k,j,m,flag;
double i;
double s1[205];
char s2[205];
char ch;
while(scanf("%lf",&i))
{
if(i==0)flag=-1;
else flag=1;
j=0,k=0;
s1[0]=i;
while(1)
{
scanf("%c",&ch);
if(ch!=' ')break;
else
{ scanf("%c ",&ch);
flag++;}
scanf("%lf",&i);

switch(ch)
{
case '*': s1[j]*=i; break;
case '/': s1[j]/=i; break;
default: s1[++j]=i;s2[k++]=ch;
}
}
if(flag==-1)break;
for(k=1,m=0;k<=j;k++,m++)
{
if(s2[m]=='+')
s1[0]+=s1[k];
else
s1[0]-=s1[k];
}
printf("%.2lf\n",s1[0]);
}
return 0;
}