北京理工大学数据结构实验报告 简易计算器(二叉树) 下载本文

4.非法输入

输入:(5+6(*5 输出:括号不匹配!

六、附录

#include #include #include #include

struct node{ char data; float number; struct node *left; struct node *right; };

struct oprtnumber{ char sign; float number; }array[20];

/*函数声明*/ char *convert();//将运算式转换成逆后缀序列

struct node *create(struct node *T,char d[]);//建立二叉链表 void postordertraverse(struct node *e);//进行后序遍历 float operation(float a,float b,char c); //四则运算函数 int in(char c);//判断是否为运算符,是运算符返回1 /*定义全局变量*/ int w,flag; float result=0;

float operation(float a,float b,char c) { switch(c) { case '+':return a+b; case '-':return a-b; case '*':return a*b; case '/':return a/b;

default :printf(\运算符错误!\ } }

struct node *create(struct node *T,char d[]) { int i;

if(d[w]>='A'&&d[w]<='Z') {T->data=d[w]; for(i=0;array[i].sign!='\\0';i++) {if(array[i].sign==d[w]) { T->number=array[i].number;break;} } T->left=NULL; T->right=NULL; w++; } else{ if(flag==0)flag=1; else T=(struct node *)malloc(sizeof(struct node )); (T)->data=d[w]; w++; T->left=(struct node *)malloc(sizeof(struct node ));

T->right=(struct node *)malloc(sizeof(struct node )); T->right=create((T)->right,d); T->left=create((T)->left,d); } return T;

}

char *convert()

{ w=0; char *a,*b;

bool jud(char stack[], int n); char str[100],str1[100]; char exp[100]; char stack[100]; char ch; int flag=1; unsigned int zs; int i=0,j=0,t=0,top=0,k=0,l=0; printf(\ ****************************************************** \\n\ printf(\ * * \\n\ printf(\ * 简易计算器(二叉树版) *\\n\ printf(\ * * \\n\ printf(\ ****************************************************** \\n\ printf(\ *使用说明* \\n\ printf(\ I.输入法为英文输入法 \\n\ printf(\ II.支持小数运算,但不支持负数运算 \\n\ printf(\请输入表达式:\ scanf(\ for(i=0;str1[i]!='\\0';i++) {b=&str1[i]; if(in(str1[i])!=1&&(i==0&&(in(str1[0])==0))||(i!=0&&in(str1[i-1])==1&&in(str1[i])==0)) {array[k].number=atof(b); array[k].sign=k+65; str[l]=array[k].sign; k++;l++; } else if(in(str1[i])==1){ str[l]=str1[i];l++;} } array[k].sign='\\0'; str[l]='\\0'; i=0;k=0;l=0; zs=strlen(str); str[zs]='#'; ch=str[i]; while(ch!='#'){ if(ch>='A'&&ch<='Z') { exp[t]=ch; t++; } else if(ch=='(') { top++; stack[top]=ch;

k++; } else if(ch=='^')

{ exp[t]=ch; t++; } else if(ch==')') { if(top!=0) { if(jud(stack,top)) { while(stack[top]!='(') { exp[t]=stack[top]; top--; t++; } top--; l++; } else {

printf(\括号不匹配!\\n\

flag=0; break; } } else { printf(\括号不匹配!\\n\ flag=0; break; } } else if(ch=='+'||ch=='-'){ while(top!=0&&stack[top]!='(') { exp[t]=stack[top]; top--; t++; } top++; stack[top]=ch; } else if(ch=='*'||ch=='/') { while(stack[top]=='*'||stack[top]=='/') { exp[t]=stack[top]; top--; t++; } top++; stack[top]=ch; } else{ printf(\第%d个数开始出错!\\n\ flag=0; break; } i++;

ch=str[i]; } if(k!=l) { printf(\括号不匹配!\\n\ flag=0; } else if (str[zs-1]=='+'||str[zs-1]=='-'||str[zs-1]=='*'||str[zs-1]=='/') { printf(\该式不是中缀表达式!\\n\ flag=0; }

if(flag!=0){ while(top!=0){ exp[t]=stack[top]; t++; top--;

} } exp[t]='\\0'; a=&exp[0]; return a; } bool jud(char stack[] ,int n) { int i; for( i = 0;i

void postordertraverse(struct node *e) { if(e->left!=NULL&&e->right!=NULL)

if((e->left->data=='+'||e->left->data=='-'|| e->left->data=='*'||e->left->data=='/'|| e->right->data=='+'||e->right->data=='-'|| e->right->data=='*'||e->right->data=='/')||

(e->left->data>='A'&&e->left->data<='Z'&&e->right->data>='A'&&e->right->data<='Z'))

{ postordertraverse(e->left); postordertraverse(e->right); e->number=operation(e->left->number,e->right->number,e->data); e->data='a'; result=e->number; } }

int main()

{ struct node *T;