下面内容段是关于C++实现简单的表达式类型的内容,应该能对码农有好处。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
typedef enum
{
INT, CHAR
typedef union
{
char vchar;
int num;
} ElemType;
typedef struct BiTNode
{
typedef struct
{
} SqStack;
{
return 0;
}
{
if(S.top == S.base) return 0;
return 1;
}
{
}
return 1;
}
{
return 1;
}
int StackEmpty(SqStack S)
{
if(S.top==S.base)
return 1;
else
return 0;
}
void list();
int getPreExpr();
int Primary(char a,char b);
void WriteExpr(BiTree E);
int Check_Variable(BiTree E);
float Operate(int a, char ope, int b);
float Value(BiTree E);
int main()
{
char choice;
float value_result;
while(1)
{
printf("请输入你的选择:");
choice = getch();
switch(choice)
{
case '1':
if(getPreExpr())
if(ReadExpr(&E))
{
isExist=1;
printf("表达式构造成功!n");
}
printf("按任意键返回:");
getch();
break;
case '2':
{
printf("n带括弧的中缀表达式为:");
WriteExpr(E);
}
else
printf("n没有成功构造表达式!");
printf("n按任意键返回:");
getch();
break;
case '3':
{
char next;
do
{
int Assign_flag=0;
int c;
char V;
printf("n表达式E为:");
WriteExpr(E);
printf("n请输入需要赋值的变量:");
V=getchar();
if((V>='a' && V<='z') || (V>='A' && V<='Z'))
{
printf("");
}
else
{
printf("请输入字母!");
next = 'y';
}
printf("请输入需要赋给该变量的值:",V);
scanf("%d",&c);
Assign(&E,V,c,&Assign_flag);
if(Assign_flag)
{
printf("赋值成功!n赋值后的表达式为:");
WriteExpr(E);
}
else
printf("赋值失败!可能表达式中没有此变量!");
printf("n是否继续赋值?<y/n>");
next = getch();
}while(next=='y' || next=='Y');
}
else
{
printf("n没有成功构造表达式!");
printf("n按任意键返回:");
getch();
}
break;
case '4':
{
printf("n算术表达式为:");
WriteExpr(E);
{
value_result = Value(E);
printf("n其值为:");
printf("%.2f",value_result);
}
else
printf("n表达式中仍存在没有赋值的变量!");
}
else
printf("n没有成功构造表达式!");
printf("n按任意键返回:");
getch();
break;
case '0':
printf("n感谢使用,再见!n按任意键退出:");
getch();
exit(0);
break;
}
}
return 0;
}
void list()
{
printf("------------------表达式类型的实现-----------------n");
printf(" 1.输入前缀表示式并构造表达式n");
printf(" 2.用带括弧的中级表示式输出表达式n");
printf(" 3.对表达式中的变量赋值n");
printf(" 4.对算术表达式求值n");
printf("----------------------------------------------------n");
}
int getPreExpr()
{
printf("n请输入前缀表示式:");
{
printf("输入错误!表达式只有一个运算符!");
return 0;
}
else if((preExpr[0] >= '0' && preExpr[0] <= '9') || (preExpr[0] >= 'a' && preExpr[0] <= 'z') || (preExpr[0] >= 'A' && preExpr[0] <= 'Z'))
{
printf("输入成功!表达式只有一个字符!");
return 1;
}
else
{
printf("输入错误!输入无法识别");
return 0;
}
else
return 1;
}
{
{
char value[2];
value[0] = preExpr[i];
value[1] = '0';
}
{
}
}
{
SqStack S;
BiTree p,q;
{
}
else
{
for(i=1; i<len && !StackEmpty(S); i++)
{
p=(BiTree)malloc(sizeof(BiTNode));
p->lchild = NULL;
p->rchild = NULL;
{
{
q->lchild=p;
Push(&S,p);
q=p;
}
{
q->rchild=p;
Push(&S,p);
q=p;
}
}
{
if(!q->lchild)
{
q->lchild=p;
Pop(&S,&q);
}
else
{
q->rchild=p;
Pop(&S,&q);
}
}
}
if(StackEmpty(S) && i >= len)
{
return 1;
}
else
{
printf("n输入的表达式有误!");
return 0;
}
}
}
int Primary(char a,char b)
{
{
{
return 0;
else
return 1;
}
else
return 0;
}
else
return 0;
}
void WriteExpr(BiTree E)
{
if(E)
{
{
if(Primary(E->data.vchar,E->lchild->data.vchar))
{
printf("(");
WriteExpr(E->lchild);
printf(")");
}
else
}
if(E->type == INT)
printf("%d",E->data.num);
else
printf("%c",E->data.vchar);
{
if(Primary(E->data.vchar,E->rchild->data.vchar))
{
printf("(");
WriteExpr(E->rchild);
printf(")");
}
else
}
else
}
}
{
{
{
}
}
}
int Check_Variable(BiTree E)
{
if(E && E->type == CHAR)
{
return 0;
if(Check_Variable(E->lchild))
{
}
}
else
return 1;
}
float Operate(int a, char ope, int b)
{
switch(ope)
{
case '+': return (a+b); break;
case '-': return (a-b); break;
case '/': return (a/b); break;
default : return 0;
}
}
float Value(BiTree E)
{
{
if(!E->lchild && !E->rchild && E->type == INT)
return E->data.num;
return Operate(Value(E->lchild),E->data.vchar,Value(E->rchild));
}
}
网友评论