📄 sun.c
字号:
#include<stdio.h>
#include<math.h>
#include<malloc.h>
#define MAX 50
typedef struct STACKCH STACKCH;
typedef struct STACKNUM STACKNUM;
typedef struct STR STR;
struct STACKCH
{
char elem[MAX];
int top;
};
struct STACKNUM
{
int elem[MAX];
int top;
};
struct STR
{
char str[MAX];
int cur;
};
char op[]={'^','*','/','+','-','(',')','#'};
int gradenum[8][2]={5,6,4,3,4,3,2,1,2,1,0,7,7,0,0,0};
void Initstack1(STACKCH *s)
{
(*s).top=-1;
}
void Initstack2(STACKNUM *s)
{
(*s).top=-1;
}
void Push1(STACKCH *s,char e)
{
if((*s).top==MAX-1)
{
printf("stack is full\n");
return;
}
(*s).top++;
(*s).elem[(*s).top]=e;
}
void Push2(STACKNUM *s,int e)
{
if((*s).top==MAX-1)
{
printf("stack is full\n");
return;
}
(*s).top++;
(*s).elem[(*s).top]=e;
}
char Pop1(STACKCH *s,char e)
{
if((*s).top==-1)
{
printf("stack is empty\n");
return 0;
}
e=(*s).elem[(*s).top--];
return e;
}
int Pop2(STACKNUM *s,int e)
{
if((*s).top==-1)
{
printf("stack is empty\n");
return 0;
}
e=(*s).elem[(*s).top--];
return e;
}
char Gettop1(STACKCH *s)
{
char e;
if((*s).top==-1)
{
printf("stack is empty\n");
return 0;
}
e=(*s).elem[(*s).top];
return e;
}
int Gettop2(STACKNUM *s)
{
int e;
if((*s).top==-1)
{
printf("stack is empty\n");
return 0;
}
e=(*s).elem[(*s).top];
return e;
}
void Gets(STR *s )
{
printf("please enter the expression:");
scanf("%s",(*s).str);
((*s).cur)=0;
}
int In(char c,char op[])
{
int i;
for(i=0;i<8;i++)
if(c==op[i])
return i;
return -1;
}
char Getnextchar(STR *s)
{
char c;
c=(*s).str[(*s).cur++];
return c;
}
char Precede(char inc,char outc)
{
int in,out;
in=In(inc,op);
out=In(outc,op);
if(gradenum[in][0]<gradenum[out][1])
return '<';
else if(gradenum[in][0]==gradenum[out][1])
return '=';
else
return '>';
}
int Operate(int a,char theta,int b)
{
int res;
switch(theta)
{
case'+':res=a+b;break;
case'-':res=a-b;break;
case'*':res=a*b;break;
case'/':res=a/b;break;
case'^':res=pow(a,b);break;
}
return res;
}
int main()
{
char x;
char theta;
int a,b;
char c;
int minusmark;
STACKCH *OPTR;
STACKNUM *OPND;
STR *EXP;
OPTR=(STACKCH *)malloc(sizeof(STACKCH));
if(OPTR==NULL)
return 0;
OPND=(STACKNUM *)malloc(sizeof(STACKNUM));
if(OPND==NULL)
return 0;
EXP=(STR *)malloc(sizeof(STR));
if(EXP==NULL)
return 0;
Initstack1(OPTR);
Initstack2(OPND);
Push1(OPTR,'#');
Gets(EXP);
c=Getnextchar(EXP);
while(c!='#'||Gettop1(OPTR)!='#')
{
if(In(c,op)==-1)//是数字或者字母
{
int total;
if(c>='a'&&c<='z')
{
char word[MAX];
int i=0;
word[i]=c;
while(In(EXP->str[EXP->cur],op)==-1)
word[++i]=Getnextchar(EXP);
word[i+1]='\0';
printf("please enter the number of %s:",word);
scanf("%d",&total);
}
else//是数字
{
int num[MAX];
int i=0;
int cs,s;
num[i]=c-48;
while(In(EXP->str[EXP->cur],op)==-1)
num[++i]=Getnextchar(EXP)-48;
for(total=0,cs=1;i>=0;i--)
{
s=num[i]*cs;
cs=cs*10;
total=total+s;
}
}
if(minusmark==1)
{
total=0-total;
minusmark=0;
}
Push2(OPND,total);
c=Getnextchar(EXP);
}
else// 是运算符
{
if(c=='-')
{
if(EXP->str[EXP->cur-2]=='('||EXP->cur-2<0)//若'-'是一目减
{
minusmark=1;
c=Getnextchar(EXP);
continue;//!!! 此处不能是break 若用break 直接跳出整个循环体 即while 的循环
}
}
switch(Precede(Gettop1(OPTR),c))
{
case'<':Push1(OPTR,c);c=Getnextchar(EXP);break;
case'=':x=Pop1(OPTR,x);c=Getnextchar(EXP);break;
case'>':
theta=Pop1(OPTR,theta);
b=Pop2(OPND,b);
a=Pop2(OPND,a);
Push2(OPND,Operate(a,theta,b));break;
}
}
}
printf("the final result is:%d\n",Gettop2(OPND));
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -