JavaScript数据结构之广义表的定义与表示方法详解


Posted in Javascript onApril 12, 2017

本文实例讲述了JavaScript数据结构之广义表的定义与表示方法。分享给大家供大家参考,具体如下:

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

A=();
B=(e);
C=(a,(b,c,d));
D=((),(e),(a,(b,c,d)));
E=(a,E);

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

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

JavaScript数据结构之广义表的定义与表示方法详解

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

JavaScript数据结构之广义表的定义与表示方法详解

我们用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结点详细如下图:

JavaScript数据结构之广义表的定义与表示方法详解

完整代码如下:

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title></title>
 </head>
 <body>
<script type="text/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;
  }
 };
 //求广义表的深度
 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
</script>
 </body>
</html>

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

这里补充一下广义表的长度和深度算法:

广义表LS=(f,(),(e),(a,(b,c,d)))的长度是多少,深度是多少

例如上表、长度为4、深度为3、为什么呢

长度的求法为最大括号中的逗号数加一、LS最大括号内有

1. f 元素后边有个逗号、
2.()元素后有个逗号、
3.(e)元素后有个逗号
4. (a,(b,c,d))后边没有逗号 ----把这个看成是一个元素

也就是三个逗号 同样被分成四组、长度就为四了

深度的求法为上面每个元素的括号匹配数加1

1. f元素的深度为0+1=1
2. ()元素深度为1+1=2
3. (e)元素深度为1+1=2
4 . (a,(b,c,d))元素的深度为2+1=3

所以深度为3

综上所诉、长度为4、深度为3

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
比较简单实用的使用正则三种版本的js去空格处理方法
Nov 18 Javascript
js各种验证文本框输入格式(正则表达式)
Oct 22 Javascript
node.js开机自启动脚本文件
Dec 24 Javascript
javascript手工制作悬浮菜单
Feb 12 Javascript
javascript实现简单加载随机色方块
Dec 25 Javascript
数组Array的排序sort方法
Feb 17 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
Sep 06 jQuery
javaScript实现复选框全选反选事件详解
Nov 20 Javascript
three.js中3D视野的缩放实现代码
Nov 16 Javascript
在Vue methods中调用filters里的过滤器实例
Aug 30 Javascript
Vue项目History模式404问题解决方法
Oct 31 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
Sep 02 Javascript
JavaScript数据结构之数组的表示方法示例
Apr 12 #Javascript
easyui-edatagrid.js实现回车键结束编辑功能的实例
Apr 12 #Javascript
Vue生命周期示例详解
Apr 12 #Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
Apr 12 #Javascript
easyui-datagrid特殊字符不能显示的处理方法
Apr 12 #Javascript
JavaScript数据结构中串的表示与应用实例
Apr 12 #Javascript
javascript数据结构之串的概念与用法分析
Apr 12 #Javascript
You might like
日本十大惊悚动漫
2020/03/04 日漫
香妃
2021/03/03 冲泡冲煮
一个查看session内容的函数
2006/10/09 PHP
深入解析php中的foreach函数
2013/08/31 PHP
PHP微信开发之文本自动回复
2016/06/23 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
js 禁用只读文本框获得焦点时的退格键
2010/04/25 Javascript
Javascript Function对象扩展之延时执行函数
2010/07/06 Javascript
JavaScript中清空数组的三种方法分享
2011/04/07 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
浅谈vue2 单页面如何设置网页title
2017/11/08 Javascript
bootstrap响应式导航条模板使用详解(含下拉菜单,弹出框)
2017/11/17 Javascript
JS实现动态生成html table表格的方法分析
2018/07/11 Javascript
Nodejs中使用puppeteer控制浏览器中视频播放功能
2019/08/26 NodeJs
[09:40]DAC2018 4.5 SOLO赛 MidOne vs Miracle
2018/04/06 DOTA
python3.5 tkinter实现页面跳转
2018/01/30 Python
PyCharm鼠标右键不显示Run unittest的解决方法
2018/11/30 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
使用Python内置模块与函数进行不同进制的数的转换
2020/04/26 Python
Python多线程的退出控制实现
2020/08/10 Python
Python descriptor(描述符)的实现
2020/11/15 Python
CSS3制作hover下划线动画
2017/03/27 HTML / CSS
params有什么用
2016/03/01 面试题
大专毕业生自我评价分享
2013/11/10 职场文书
公司业务主管岗位职责
2013/12/07 职场文书
简历中的自我评价怎么写
2014/01/29 职场文书
生产部管理制度
2014/01/31 职场文书
爱情保证书大全
2014/04/29 职场文书
师德师风的心得体会
2014/09/02 职场文书
2014国庆节国旗下演讲稿(精选版)
2014/09/26 职场文书
质量整改报告范文
2014/11/08 职场文书
团代会开幕词
2015/01/28 职场文书
2015年党员公开承诺事项
2015/04/27 职场文书
欠款证明
2015/06/24 职场文书
2019年最新证婚词精选集!
2019/06/28 职场文书