数据结构教程(JAVA语言描述)给定一个字符串str,包含一个简单算术表达式的后缀表达式(仅包含正整数和‘+‘、’-‘、’*’、’/’运算符)

目录

题目:

思路:

代码:


题目叙述

编写一个实验程序,给定一个字符串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());
    }
}

 希望大家采纳的同时点个关注,关注留言会及时回复哦!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今霄上弦月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值