软件技术基础实验五
----- 二叉树的应用-代数表达式实现
班级:电信 0901
学号:0703090106
姓名:蒋玮珂
实验五 二叉树的应用-代数表达式实现
(1)实验题目:
编写一个程序,用二叉树表示代数表达式,二叉树的每个结点包括一个运算
符或操作数,代数表达式中只包含+、-、*、/和整数且没有错误,要求按照四则
运算法则构造二叉树,然后由对应的二叉树计算对应的表达式的值。
(2)实验目的:
1.掌握二叉树的数据类型描述及特点。
2.掌握二叉树的存储结构(二叉链表)的建立算法。
3.掌握二叉链表上二叉树的基本运算的实现。
(3)调试通过并正确执行给定功能要求的实验代码:
#include "stdafx.h"
#include
#include
typedef struct bitree
{
int data;
bitree * lchild;
bitree * rchild;
}bitree;
bitree * createtree(int b[],int i,int j)
{
bitree * p;
int k,plus=0,posi=0;
if(i==j)
{
p=new bitree;
p->data=b[i];
p->lchild=p->rchild=NULL;
return p;
}
//i!=j
for(k=i;k<=j;k++)
{
if((b[k]==43)||(b[k]==45))
{
plus++;
posi=k;
}
}
//没有+或-
if(!plus)
for(k=i;k<=j;k++)
if((b[k]==42)||(b[k]==47))
{
plus++;
posi=k;
}
//还有符号存在递归
if(plus)
{
p=new bitree;
p->data=b[posi];
p->lchild=createtree(b,i,posi-1);
p->rchild=createtree(b,posi+1,j);
return p;
}
else
return NULL;
}
double comp(bitree *root)
{
double v1,v2;
if(!root)
return 0;
if ((!root->lchild)&&(!root->rchild))
return root->data;
v1=comp(root->lchild);
v2=comp(root->rchild);
switch(root->data)
{
case 43:
case 45:
case 42:
case 47:
default:return 0;
return v1+v2;
return v1-v2;
return v1*v2;
return v1/v2;
}
}
void DispBTNode(bitree *root)
{
if(root)
{
cout<data;
if(root->lchild||root->rchild)
{
cout<<'(';
DispBTNode(root->lchild);
cout<<',';
DispBTNode(root->rchild);
cout<<')';
}
}
}
void main()
{
char a[100];
int b[100],c=0;
int i,j=0,n;
bitree * root;
double y;
ifstream infile("e:\\Program Files\\MSDev98\\MyProjects\\file1.txt");
ifstream ifile("e:\\Program Files\\MSDev98\\MyProjects\\file2.txt");
ofstream outfile("e:\\Program Files\\MSDev98\\MyProjects\\file3.txt");
infile>>n;
for(i=0;i>a[i];
}
a[i]='\0';
for(i=0;i=48)&&(a[i]<=57))
{
if((a[i-1]>=48)&&(a[i-1]<=57))
c=c*10+(a[i]-48);
else
c=a[i]-48;
}
else
{
b[j]=c;
j++;
b[j]=a[i];
j++;
}
}
}
b[j]=c;
j++;
b[j]='\0';
for(i=0;i
说明:(1)file1 输入的为代数式的符号个数,一个数字和一个符号都算 1 个
(2)file2 输入的为代数式,式子中不能出现 43 42 45 47 这几个危险数字
(3)file3 为输出的结果,43 为加,45 为减,42 为乘,47 为除