什么是广义表
广义表:(a1,a2...,an)其中a1...an可以为单个数据元素,也可以为另一个广义表
例如:在Python中的列表就是一种广义表[[1,2,3],[1,1,1],2,3,[2,3,4]]
广义表数据结构定义
typedef struct gNode{
struct gNode *next;
//指向下一个元素或者下一个广义表
int tag;
//tag为0表示当前为单个数据元素,为1表示当前为子广义表
union{
char data;
struct gnode *slist;
}val;
//存放数据项,为节省类型使用union共用体,当单个节点时使用data域,子广义表时使用slist域
}gNode;
广义表的遍历
void traverse(gNode *p){
if(!p) return;
//如果节点为空,返回
if(p->tag == 0) printf("%c ",p->val.data);
//如果当前为单个数据元素,输出
else traverse(p->val.slist);
//如果当前为子表,遍历子表
traverse(p->next);
//遍历后继元素
}
求广义表长度
- 广义表的长度,指的是
广义表中所包含的数据元素的个数
。 - 计算元素个数时,广义表中存储的
每个原子算作一个数据
,同样每个子表也只算作是一个数据
。- LS = {a1,a2,…,an} 的长度为 n;
- 广义表 {a,{b,c,d}} 的长度为 2;
- 广义表 { {a,b,c}} 的长度为 1;
- 空表 {} 的长度为 0。
int GetLength(gNode *p){
if(!p) return 0;
//如果表为空 返回0
int num = 0;
for(gNode *q = p;q;q = q->next){
num++;
}
return num;
}
求广义表最大深度
广义表的最大深度其实就是一个变形的括号匹配问题,记录匹配过程中栈的最大深度即为广义表的最大深度。