广义表的简单Java实现

广义表是西工大879的特色,反正这玩意用C实现起来挺烦人的,要反复判断类型,今天改用Java写了一回,感觉舒服多了,不但有面向对象,还屏蔽了指针这种烦人的东西,加上垃圾回收机制让人不用担心内存泄漏,真是爽极了
本代码实现了广义表的求长度,求深度和递归遍历(体现在toString()上),实际测试时建议面向接口编程,不要直接用实现类创建对象


abstract class GY_Node{
    public static final int head = 0;
    public static final int subNode = 1;
    public static final int element = 2;
    public int tag;
    public GY_Node tlink;
    private Object info;
    public int getTag() {
        return tag;
    }
    public GY_Node getTlink() {
        return tlink;
    }
    public GY_Node setTlink(GY_Node tlink) {
        this.tlink = tlink;
        return tlink;
    }
    public Object getInfo() {
        return info;
    }
    public void setInfo(Object info) {
        this.info = info;
    }
    public int getLength() {
        int length = 0;
        GY_Node cur_node = this;
        while((cur_node.tlink)!=null) {
            length++;
            cur_node = cur_node.tlink;
        }
        return length;
    }
    public int getDepth() {
        // 深度一般为 1+其所有节点的深度的最大值
        int sub_depth = 0;
        GY_Node subs = tlink;
        while(subs!=null){
            sub_depth = Math.max(sub_depth,subs.getDepth());
            subs = subs.tlink;
        }
        return 1+sub_depth;
    }
}
//广义表头
class GY_Head extends GY_Node{
    public GY_Head(Character name){
        this.tag = head;
        this.setInfo(name);
    }
    @Override
    public void setInfo(Object info) {
        if(info instanceof Character){
            super.setInfo(info);
        }else{
            System.err.println("错误,表头的数据字段应该是字符(表名)!");
        }
    }
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(getInfo()).append('(');
        if(tlink!=null) {
            sb.append(tlink.toString());
        }
        sb.append(')');
        return sb.toString();
    }
}

//广义表子节点
class GY_SubNode extends GY_Node{
    public GY_SubNode(GY_Node hlink){
        this.tag = subNode;
        this.setInfo(hlink);
    }
    @Override
    public void setInfo(Object info) {
        if(info instanceof GY_Head){
            super.setInfo(info);
        }else{
            System.err.println("错误,子节点的数据字段应该是头结点指针!");
        }
    }
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(getInfo().toString());
        if(tlink!=null){
            sb.append(',').append(tlink.toString());
        }
        return sb.toString();
    }
}

class GY_Element extends GY_Node{
    public GY_Element(Character data){
        this.tag = element;
        this.setInfo(data);
    }
    @Override
    public void setInfo(Object info) {
        if(info instanceof Character){
            super.setInfo(info);
        }else{
            System.err.println("错误,元素的数据字段应该是字符!");
        }
    }

    @Override
    public int getDepth() {
        //元素的深度为0
        return 0;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(getInfo());
        if(tlink!=null){
            sb.append(',').append(tlink.toString());
        }
        return sb.toString();
    }
}

public class GuangyiTable {

    public static void main(String[] args) {
        GY_Node head = new GY_Head('A');
        GY_Node head_= new GY_Head('B');
        head_.setTlink(new GY_Element('e')).setTlink(new GY_Element('f')).setTlink(new GY_Element('g'));
        head.setTlink(new GY_Element('a')).setTlink(new GY_SubNode(head_)).setTlink(new GY_Element('b')).setTlink(new GY_Element('c'));
        System.out.println(head);
        System.out.println(head.getLength());
        System.out.println(head.getDepth());
        System.out.println(head_.getLength());
        System.out.println(head_.getDepth());
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值