目录
题目叙述
编写一个实验程序,给定一个字符串str,包含一个简单算术表达式的后缀表达式(仅包含正整数和'+'、’-‘、’*’、’/’运算符)。完成以下任务。
(1)将后缀表达式采用二叉树表示(称为表达式树)。
例如一个后缀表达式str="10#3#-3#5#2#/*+"对应的二叉树表示。
如图所示:
(2)采用括号表示法输出该表达式树。
(3)利用该表达式树求出表达式的值,上述表达式树的求值结果是14.5
(4)将该表达式树转换为中缀表达式并输出。
基本思路
采用前面学的求后缀表达式值的过程构造表达式树(将求值步骤改为建立表达式树的结点),再利用后序遍历产生对应的中缀表达式。
代码详细
import java.util
import java.util.Stack;
import javax.lang.model.util.ElementScanner6; * ;
class Node//表达式数结点类
{
int data;
char op;
Node lchild,rchild;
public Node(int data)//构造方法1
{
this.data=data;
lchild=rchild=null;
}
public Node(char op)//构造方法2
{
this.op=op;
lchild=rchild=null;
}
}
public class Exp5
{
static Node root;//表达式二叉树根结点
static String bstr;//二叉树的括号表示串
public static void CreateEt(String str)//创建表达式树
{
Node p,a,b;
int i=0;
char ch;
Stack<Node>st=new Stack<Node>();//定义一个栈
while(i<str.length())
{
ch=str.charAt(i);
if(ch=='+'||ch=='-'||ch=='*'||ch=='/')//运算符
{
p=new Node(ch);
a=st.pop();
b=st.pop();
p.lchild=b;
p.rchild=a;
st.push(p);
i++;
}
else//运算数
{
int d=0;
while(i<str.length()&&ch!='#')//将运算数串转换为数值d
{
d=d*10+(ch-'0');
i++;
ch=str.charAt(i);
}
a=new Node(d);
st.push(a);
i++;
}
}
root=st.peek();//栈顶结点为根结点
}
public static String DispEt()//返回二叉链的括号表示串
{
bstr="";
DispEtl(root);
return bstr;
}
private static void DispEtl(Node t)//被DispEt()方法调用
{
if(t!=null)
{
if(t.lchild==null&&t.rchild==null)
bstr+=(int)t.data;//叶子结点输出data
else
bstr+=t.op;//非叶子结点输出op
if(t.lchild!=null||t.rchild!=null)
{
bstr+="(";//有孩子结点时输出“(”
DispEtl(t.lchild);//递归输出左子树
if(t.rchild!=null)
bstr+=",";//有右孩子结点时输出“,”
DispEtl(t.rchild);//递归输出右子树
bstr+=")";//输出“)”
}
}
}
public static double Comp()//表达式树的值
{
return Compl(root);
}
public static double Compl(Node t)//被Comp()方法调用
{
if(t.lchild==null&& t.rchild==null)
return t.data;
double a=Compl(t.lchild);
double b=Compl(t.rchild);
switch(t.op)
{
case'-':return a - b;
case'+':return a + b;
case'*':return a * b;
case'/':return 1.0 *a/b;
}
return 0;
}
public static String Displn()//输出中缀表达式
{
bstr="";
Displn1(root,1);
return bstr;
}
public static void Displn1(Node t,int h)//被Displn()方法调用
{
if(t==null)return;
else if(t.lchild==null && t.rchild==null)//叶子结点
bstr+=t.data;
else
{
if(h>1)bstr+="(";//有子表达式加一层括号
DispEtl(t.lchild,h+1);//处理左子树
bstr+=t.op;//输出运算符
DispEtl(t.rchild,h+1);//处理右子树
if(h>1)bstr+=")";//有子表达式加一层括号
}
}
public static void main(String[] args)
{
String str="10#3#-3#5#2#/*+";//后缀表达式
System.out.println();
System.out.println("后缀表达式:"+str);
System.out.println("(1)创建表达式二叉树 root");
System.out.println("(2)输出表达式二叉树");
System.out.println("root:"+DispEt());
System.out.println("(3)计算表达式值:"+Comp());
System.out.println("(4)对应的中缀表达式:"+Displn());
}
}
希望大家采纳的同时点个关注,关注留言会及时回复哦!!