广义表的表示javascript

广义表是线性表的推广,也有人称其为列表。 那么它和线性表有什么区别呢?线性表中每个成员只能是单个元素,而广义表中的成员可以是单个元素,也可以是广义表,分别称为广义表的原子和子表。下面举几个广义表的例子。

A=();

B=(e);

C=(a,(b,c,d));

D=((),(e),(a,(b,c,d)));

E=(a,E);

由于广义表中的数据元素可以具有不同的结构(原子或列表),因此难以用顺序存储结构表示,通常采用链式存储结构。由于列表中的元素可以是原子也可以是列表,所以需要两种结构的节点,一种是表节点,一种是原子节点。

一个表节点由三个域组成,标志域、指向表头的指针域、指向表尾的指针域。而原子节点只需要两个域,标志域和值域。如下图:

上面讲到的五个列表的存储结构如下图:

我们用javascript来实现广义表及其基本操作吧。

首先需要定义广义表的存储结构:

var ATOM=0;
	var LIST=1;
	//广义表的存储结构
	function ListNode(){
		//标识位
		this.tag=undefined;
		//原子结点的值域
		this.atom=null;
		//列表结点的值域
		this.ptr={
			hp:null,
			tp:null
		};
	}

然后是创建广义表的过程:

//创建广义表
	ListNode.prototype.createList=function(string){
		string=string.trim();
		//创建单原子广义表
		var q;
		if(/^[\w-]+$/.test(string)){//含有单字符
			this;tag=ATOM;
			this.atom=string;
		}else{
			this.tag=LIST;
			var p =this;
			//去掉最外层括号(和)
			var sub=string.substr(1,string.length-2);
			do{
				var h,
					i=0,
					k=0,
					n=sub.length,
					ch;
				do{
					ch=sub[i++];
					if(ch=='('){
						++k;
					}else if(ch==')'){
						--k;
					}
				}while(i<n&&(ch!=','||k!=0));
				//i为第一个逗号分隔索引
				if(i<n){
					h=sub.substr(0,i-1);//每次遍历取出第一个结点,无论是原子还是列表
					sub=sub.substr(i,n-i);
				}else{//最后一组
					h=sub;
					sub='';
				}
				if(h==='()'){//空子表无表头结点
					p.ptr.hp=null;
				}else{//创建表头结点
					this.createList.call((p.ptr.hp=new ListNode()),h);
				}
				q=p;
				//创建表尾结点
				if(sub){
					p=new ListNode();
					p.tag=LIST;
					q.ptr.tp=p;
				}
			}while(sub);

			q.ptr.tp=null;
		}
	};

接下就是求广义表的深度,深度的定义为广义表中括弧的重数,是广义表的一种量度。例如,多元多项式广义表的深度为多项式中变元的个数。设LS=(a1,a2,a3,…,an),求LS的深度可以分解为n个之问题,每个子问题为求ai的深度。如果ai是原子,则定义其深度为0,如果ai是广义表,则LS的深度为最大ai的深度+1。空表也是广义表,所以深度为1。实现代码如下:

//求广义表的深度
	ListNode.prototype.depth=function(){
		return getDepth(this);
	}
	function getDepth(list){//深度为括号的重数,也可理解为左括号出现的个数
		if(!list){
			return 1;
		}else if(list.tag===ATOM){
			return 0;
		}else {
			var m=getDepth(list.ptr.hp)+1;
			var n=getDepth(list.ptr.tp);
			return m>n?m:n;
		}
	}

最后我们创建测试案例:

var node=new ListNode();
	node.createList('((),(a),(b,(c,d,e)))');
	alert(node.depth());//5

node结点详细如下图:

完整代码如下:

由于广义表的应用多在于数学领域的公式推导和演算上,这里就不再详解了。

时间: 2024-10-22 16:34:13

广义表的表示javascript的相关文章

javascript实现数据结构:广义表

原文:javascript实现数据结构:广义表  广义表是线性表的推广.广泛用于人工智能的表处理语言Lisp,把广义表作为基本的数据结构. 广义表一般记作: LS = (a1, a2, ..., an) LS是广义表的名称,n是它的长度,ai可以是单个元素,也可以是广义表,分别称为广义表LS的原子和子表.习惯上,用大写字母表示广义表的名称,小写字母表示原子.当广义表LS非空时,称第一个元素a1为LS的表头,称其余元素组成的表(a2, a3, ..., an)是LS的表尾. 下面列举一些广义表的例

c++数据结构之广义表

最近学习了广义表,我们知道广义表也是一种线性表,而顾名思义广义表就是不止一个表,下面来举个栗子: A=( ) B=(1 , 2,3) C=(1 ,2 ,3, ( a , b ,c) ) D=(1, 2, 3, (a,( b,c),d),4) 以上A,B,C,D都是广义表,只不过深度不一样,也就是括号的对数不一样,A是个特殊的广义表,即空表.B里面有三个元素,C里面有6个元素,包括一个子表(a,b,c),C也同理,只不过多了一层子表.由此可总结为一句话:表里有表 这样看可能不太直观,下面以广义表C

数据结构实践项目——数组和广义表

本文针对 [数据结构基础系列网络课程(5):数组和广义表] 1. 数组的基本概念与存储结构 2. 特殊矩阵的压缩存储 3. 稀疏矩阵的三元组表示 4. 稀疏矩阵的十字链表表示 5. 广义表 6. 广义表的存储结构及基本运算的实现 [项目1 - 猴子选大王(数组版)] 一群猴子,编号是1,2,3 -m,这群猴子(m个)按照1-m的顺序围坐一圈.从第1只开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,最后一只出圈的猴子为大王.输入m和n,输出猴子离开圈子的顺序,从中也可以看出最后为大王是几号

数据结构与算法系列研究四——数组和广义表

稀疏矩阵的十字链表实现和转置 一.数组和广义表的定义 数组的定义1:一个 N 维数组是受 N 组线性关系约束的线性表.           二维数组的逻辑结构可形式地描述为:           2_ARRAY(D,R)              其中 D={aij} | i=0,1,...,b1-1; j=0,1,...,b2-1;aij∈D0}              R={Row,Col}              Row={<aij,ai,j+1>|0<=i<=b1-1;

广义表的实现

/*--------------------------------------------------------------------- 广义表的存储结构 ---------------------------------------------------------------------*/ #include<stdio.h> #include<stdlib.h> typedef char ElemType;//元素类型是字符型 //广义表的存储结构 struct GN

广义表的实现(法二)

#include<iostream> #include<string> using namespace std; enum elemTag {ATOM,LIST}; class GList; class GLnode { private: elemTag Tag; //标志是原子还是子表 0:原子 1:子表 union { char data; //原子结点值域 struct //表结点指针域 { GLnode *hp; GLnode *tp; }ptr; }; friend cl

广义表

其中包括广义表的创建.输出.拷贝构造.赋值运算符重载.析构.有效数据个数以及广义表深度 #pragma once #include<iostream> #include<assert.h> #include<ctype.h> using namespace std; enum Type {  HEAD, VALUE, SUB };//头结点.值.子表 struct GeneralizedNode {  Type _type;  //广义表结点类型  Generalize

数据结构之广义表

#include<stdio.h> //广义表的头尾链表存储结构 typedef int AtomType; typedef enum NodeType{ATOM,LIST}ElemTag;//ATOM表示原子结点,LIST表示表节点 typedef struct GLNode{ ElemTag tag; union{ AtomType atom; struct List{ struct GLNode* hp,*tp; } htp; }atom_htp; }GLNode,*GList; //求

数据结构——广义表

定义 Python中的list就是一种广义表,使用起来非常方便.广义表的特点就是能够存储不同类型的元素,也支持嵌套使用,即表中还有表.关于广义表的定义还有几本操作归纳如下: ADT Linear List: 元素组成: 能存储不同元素类型的表结构叫做广义表,支持嵌套操作. 基本操作: InitGList() 创建一个空表 DestoryGList() 销毁一个表 GListLength()  获取表的长度 GListDepth()  获取表的深度 PrintList() 遍历一次表 Insert