📄
字号:
#include <stdio.h>
#include <windows.h>
#include <malloc.h>
#define LEN 255
#define NLEN 5
typedef struct
{
char nodeclass;
void *left,*right;
char op;//操作副
int con;//书
}exprtree;
exprtree *r;
char sym[NLEN];
char input[LEN];
int pinput=0;
exprtree * maketree(char * op,exprtree *left,exprtree * right);
exprtree * expression ();
float apply(char op,float l,float r);
bool ismulop(char p)
{
switch (p)
{
case '*':
case '/':
{return true;break;}
default : return false;
}
}
bool isaddop(char p)
{
switch (p)
{
case '+' :
case '-' :
return true;break;
default : return false;
}
}
char kind (char * p)
{
switch(*p)
{
case '*':
case '/' :
case '+' :
case '-' :return 'o';break;// 1代表'Oper'
case '(': return 'l';break;//2代表'lparen'
case ')': return 'r'; break;//3代表'rparen'
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '0':return 'n';break;//4代表'ident'
case 0: return 'f'; //结束
default: return 'e';//error
}
}
void getsymbol()
{ int psym=0;
memset(sym,0,NLEN);
if (input[pinput]==0) return;
while(input[pinput]>='0' && input[pinput]<='9')
sym[psym++]=input[pinput++];
if (psym==0) sym[psym++]=input[pinput++];
return;
}
float evaluate (exprtree *t)
{ float l, r;
if (t->nodeclass == 'o')
{l = evaluate ((exprtree *)t->left);
r = evaluate ((exprtree *)t->right);
printf("%c ",t->op);
return apply (t->op, l, r);
}
else if (t->nodeclass == 'n')
{ printf("%d ",t->con);return (float)t->con;}
else return 0;
}
float apply(char op,float l,float r)
{
switch (op)
{case '+': return (l+r);
case '-': return (l-r);
case '*': return (l*r);
case '/': return (l/r);
}
return 0;
}
exprtree * factor( )
{ exprtree * result;
char k;
k=kind(sym);
if (k=='r') {printf("括号不匹配!\n");exit(0);}
if (k=='n')
{result=maketree(sym,NULL,NULL);getsymbol();return result;}
else if (k=='f') {result=NULL;getsymbol();return result;}
else if (k=='l')
{ getsymbol();
result = expression();
}
if (kind(sym)!='r') {printf("括号不匹配!\n");exit(0);}
getsymbol();
return result;
}
exprtree * term()
{ exprtree * loperand,* roperand;
char op[NLEN];
loperand = factor();
while (ismulop(*sym))
{
memcpy(op,sym,NLEN);
getsymbol();
roperand = factor();
loperand = maketree(op,loperand,roperand);
}
return loperand;
}
exprtree *expression ()
{
exprtree *loperand,*roperand;
char op[NLEN];
loperand = term();
while (isaddop(*sym))
{
memcpy(op,sym,NLEN);
getsymbol();
roperand =term();
loperand = maketree (op,loperand,roperand);
}
return loperand;
}
exprtree * maketree(char * op ,exprtree *left,exprtree *right)
{ exprtree * pt;
char k;
pt=(exprtree *)malloc(sizeof(exprtree));
pt->left=left;
pt->right=right;
k=kind(op);
if (k=='n') {pt->nodeclass='n';pt->con=atoi(op);}
else if (k=='o'){pt->nodeclass='o';pt->op=*op;}
else {printf("输入错误!");exit(0);};
return pt;}
int getinput()
{char c;
memset(input,0,LEN);
pinput=0;
c=getchar();
while (c!=10)
{ while (c==32) c=getchar();
if (( c!='+' && c!='-' && c!='*' && c!='/' && c!='(' && c!= ')') && (c<'0' || c>'9') )return 1;//错误的输入值
input[pinput++]=c;
c=getchar();
}
pinput=0;
return 0;//正常返回
}
void checkerror()
{ char k;
int no=0,nl=0,nr=0,nn=0;
getsymbol();
k=kind(sym);
while (k!='f')
{ switch (k)
{case 'n':nn++;break;
case 'l':nl++;break;
case 'r':nr++;break;
case 'o':no++;break;
}
getsymbol();
k=kind(sym);
}
if (nr!=nl) {printf("括号不匹配!\n");exit(0);}
if (no>=nn) {printf("操作符错误!\n");exit(0);}
pinput=0;
}
main ()
{ float f;
printf("请输入表达式:\n");
if (getinput()){printf("请输入正确的表达式:\n");exit(0);}
checkerror();
getsymbol();
r=expression();
printf("后序表达式为:\n");
if (r==NULL)
{ printf("\n结果为:\n"); }
else
{ f=evaluate(r);
printf("\n结果为:%f\n",f);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -