借个地方放下代码,未调试 ,还请各位不要费神 了谢谢
#include "stdlib.h"
#include "stdio.h"
#include <setjmp.h>
jmp_buf jmp;
struct a
/*存放字符和字符运算优先级*/
{
char ax[10];
char *top1;
char *base1;
int p1;
};
struct b
/*存放运算数*/
{
float bx[10];
float *top;
float *base;
};
struct a *p;
struct b *s;
int p_i=0,s_i=0;
char *st,*st1;
float num[10],jg1;
int pan(char c)
/*判断运算优先级别*/
{
int i;
switch(c)
{
case '+':
i=1;
break;
case '-':
i=1;
break;
case '*':
i=2;
break;
case '/':
i=2;
break;
case '(':
i=3;
break;
case ')':
i=4;
break;
default :
printf("表达式错误,你妹\n");
exit(0);
}
return(i);
}
void init1(struct a *p)
/*初始化站*/
{
p->base1=p->ax;
p->top1=p->ax;
}
void init(struct b *s)
{
s->base=s->bx;
s->top=s->bx;
}
void pusha(struct a *p,char c)
{
*(p->top1)=c;
p->top1++;
p->p1=pan(c);
}
void pushb(struct b *s,float c)
{
*(s->top)=c;
s->top++;
}
char popa(struct a *p)
{
char c;
p->top1-=1;
c=*(p->top1);
return(c);
}
float popb(struct b *s)
{
float c;
s->top-=1;
c=*(s->top);
return(c);
}
char SEEK(struct a *p)
{
char c;
c=*(p->top1-1);
return c;
}
float jisuanshu(int num1[],int i)
{
int
j;
float f,f1=0;
f=num1[0];
for(j=1;j<=i;j++)
{
if(num1[j]>=0)
f=10*f+num1[j];
else
break;
}
if(j<i)
{
f1=num1[i]/10;
for(;i>j;i--)
f1=(f1+num1[i])/10;
}
f=f+f1;
return(f);
}
void biaodashi(char *st,int i,int z)
{
if(*(st+i)!='('&&*(st+i-1)!=')')
{
printf("表达式错误1,请重新输入:\n");
longjmp(jmp,1);
}
}
void biaodashi1(char *st,int i,int z)
{
if(*(st+i-1)!=')')
{
printf("表达式错误1,请重新输入:\n");
longjmp(jmp,1);
}
}
int qufen()
{
struct shu
{
int num1[10];
int j1;
}sj;
int i=0,j=0,z=1,k=0,m=0,k1=0,k2=0;
float f;
while(*(st+i)!='\0')
{
if((*(st+i)>='0'&&*(st+i)<='9')||*(st+i)=='.')
{
sj.num1[j]=*(st+i)-'0';
sj.j1=j;
j++; i++;
z=0;
}
else
{
if(z>0)
biaodashi(st,i,z);
if(z==0)
{
f=jisuanshu(sj.num1,sj.j1);
num[k]=f;
k++;j=0;f=0;
if(i!=0&&*(st+i)=='(')
{
printf("表达式错误1,请重新输入:\n");
longjmp(jmp,1);
}
}
if(*(st+i)=='(')
k1++;
else
if(*(st+i)==')')
k2++;
*(st1+m)=*(st+i);
m++;
i++;
z++;
}
}
if(z!=0)
biaodashi1(st,i,z);
if(k1!=k2)
{
printf("表达式错误2,请重新输入:\n");
longjmp(jmp,2);
}
if(j!=0)
{
f=jisuanshu(sj.num1,sj.j1);
num[k]=f;
}
*(st1+m)='\0';
}
float jisuan(char c,float a1,float a2 )
/*计算*/
{
switch(c)
{
case '+':
a1=a1+a2;
break;
case '-':
a1=a2-a1;
break;
case '*':
a1=a1*a2;
break;
case '/':
a1=a2/a1;
break;
}
return(a1);
}
int j_jisuan()
{
float a1,a2,jg1;
int n;
char c;
int j_jisuan1();
pusha(p,*(st+p_i));
p_i++;
pushb(s,num[s_i]);
pushb(s,num[s_i+1]);
s_i+=2;
while(*(st+p_i)!='\0'){
n=pan(*(st+p_i));
if(n!=3&&n!=4){
if(n>p->p1){
pushb(s,num[s_i]);
a1=popb(s);
a2=popb(s);
jg1=jisuan(*(st+p_i),a1,a2);
pushb(s,jg1);
p_i++;
s_i++;
}
else{
a1=popb(s);
a2=popb(s);
c=popa(p);
jg1=jisuan(c,a1,a2);
pushb(s,jg1);
pusha(p,*(st+p_i));
pushb(s,num[s_i]);
p_i++;
s_i++;
}
}
else
j_jisuan1();
}
}
int j_jisuan1()
{
float a1,a2;int i,n;
char c;
pusha(p,*(st+p_i));
p_i++;
while(*(st+p_i)!='\0'){
n=pan(*(st+p_i));
if(n!=3&&n!=4)
j_jisuan();
else if(n==3)
j_jisuan1();
else{
a1=popb(s);
a2=popb(s);
c=popa(p);
jg1=jisuan(c,a1,a2);
pushb(s,jg1);
popa(p);
for(i=1;*(p->top1-i)!='(';i++)
;
i--;
if(i==1){
pushb(s,num[s_i]);
pusha(p,*(st+p_i));
s_i++;p_i++;
}
else if(i==3){
a1=popb(s);
a2=popb(s);
c=popa(p);
jg1=jisuan(c,a1,a2);
pushb(s,jg1);
}
}
}
}
float jieguo()
{
float a1,a2;
char c;
j_jisuan();
while(p->top1!=p->base1){
a1=popb(s);
a2=popb(s);
c=popa(p);
jisuan(c,a1,a2);
pushb(s,jg1);
}
return (jg1);
}
int main()
{
char *st,*st1,num4[20],num5[10],n;
float num[10],zjg;
st=num4;
st1=num5;
s=(struct b*)malloc(sizeof(struct b));
p=(struct a*)malloc(sizeof(struct a));
printf("请输入表达式:\n");
setjmp(jmp);
scanf("%s",st);
qufen();
zjg=jieguo();
printf("%f\n",zjg);
printf("还要计算吗?y/n\n");
scanf("%c",&n);
while(n!='n')
{
if(n=='y')
longjmp(jmp,1);
else if(n=='n')
exit(0);
else
{
printf("请输入:y 或者 n\n");
scanf("%c",&n);
}
}
}