广义表是西工大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());
}
}