堆分配存储表示

这种存储表示的特点是,仍以一组地址连续的存储单元存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配而得。

结构图:

实现:

 function HString(){
this.ch = {};
this.length = 0;
}
exports.HString = HString;
HString.prototype = {
// 1 <= position <= this.length.在串的第position个字符之前插入串tHString
strInsert: function(position, tHString){
if(position < 1 || position > this.length + 1)
throw new Error('unexpected position'); if(tHString.length){
// 为插入t而腾出位置
for(var i = this.length - 1, len = position - 1; i >= len; --i)
this.ch[i + tHString.length] = this.ch[i];
// s.ch[position - 1..position + tHString.length - 2] = tHString.ch[0..tHString.length - 1];
// for(i = 0, len = tHString.length - 1; i <= len; i++)
// this.ch[position - 1 + i] = tHString.ch[i];
stringCopy(this.ch, tHString.ch, position - 1, tHString.length - 1, 0); this.length += tHString.length;
}
},
strAssign: function(chars){
// for(var i = 0, len = chars.length; i < len; i++){
// this.ch[i] = chars[i];
// }
stringCopy(this.ch, chars, 0, chars.length - 1, 0);
this.length = chars.length;
},
strLength: function(){
return this.length;
},
strCompare: function(tHString){
for(var i = 0, len = this.length; i < len && i < tHString.length; i++)
if(this.ch[i] !== tHString.ch[i]) return this.ch[i] - tHString.ch[i]; return this.length - tHString.length;
},
clearString: function(){
this.ch = {};
this.length = 0;
},
concat: function(s){
var t = new HString(); // t.ch[0..this.length - 1] = this.ch[0..this.length - 1]
stringCopy(t.ch, this.ch, 0, this.length - 1, 0);
t.length = this.length + s.length;
// t.ch[this.length..t.length - 1] = s.ch[0..s.length - 1]
stringCopy(t.ch, s.ch, this.length, s.length - 1, 0); return t;
},
substring: function(position, len){
position = ~~position || 0;
len = ~~len || this.length;
if(position < 0 || position > this.length - 1 || len < 0 || len > this.length - position)
throw new Error('unexpected paramater'); var sub = new HString();
stringCopy(sub.ch, this.ch, 0, len - 1, position);
sub.length = len; return sub;
},
toString: function(){
var s = '';
for(var i = 0, len = this.length; i < len; i++){
s += this.ch[i];
}
return s;
}
}; function stringCopy(destination, target, destStart, length, targetStart){
destStart = destStart || 0;
length = length || target.length;
targetStart = targetStart || 0; for(var i = 0; i <= length; i++ ){
destination[destStart + i] = target[targetStart + i];
}
}

单元测试:

 describe('HString tests', function(){
var s = new HString();
var t = new HString(); it('should assign chars', function(){
s.strAssign('hello world!');
expect(s + '').toBe('hello world!'); t.strAssign('jesus ');
expect(t + '').toBe('jesus ');
}); it('should insert string into s', function(){
s.strInsert(7, t);
expect(s + '').toBe('hello jesus world!');
}); it('should concat string', function(){
var ret = s.concat(t);
expect(ret + '').toBe('hello jesus world!jesus ');
}); it('should get substring', function(){
var ret = s.substring(0);
expect(ret + '').toBe('hello jesus world!'); ret = s.substring(5, 13);
expect(ret + '').toBe(' jesus world!'); ret = s.substring(3, 8);
expect(ret + '').toBe('lo jesus');
});
});

javascript实现数据结构:串--堆分配存储表示的更多相关文章

  1. javascript实现数据结构: 串的块链存储表示

    和线性表的链式存储结构相类似,也可采用链式方式存储串值.由于串结构的特殊性--结构中的每个数据元素是一个字符,则用链表存储串值时,存在一个“结点大小”的问题,即每个结点可以存放一个字符,也可以存放多个 ...

  2. 串String(2):串的实现(堆分配存储表示法)

    7/27/2017,先占个位,最近事情比较忙,明天敲一波代码,预测在一星期内搞定 9/02/2017,看到这个十分汗颜,八月去美帝学习了,没有抽空补上这一博文,计划这个月开了数据结构课后补上

  3. javascript实现数据结构与算法系列

    1.线性表(Linear list) 线性表--简单示例及线性表的顺序表示和实现 线性表--线性链表(链式存储结构) 线性表的静态单链表存储结构 循环链表与双向链表 功能完整的线性链表 线性链表的例子 ...

  4. javascript实现数据结构:串--定长顺序存储表示以及kmp算法实现

    串(string)(或字符串)是由零个或多个字符组成的有限序列.串中字符的数目称为串的长度.零个字符的串称为空串(null string),它的长度为零. 串中任意个连续的字符组成的子序列称为该串的子 ...

  5. 数据结构——串(KMP)

    空串:长度为0的串 空格串:由一个或多个空格组成的串 串常用的3种机内表示方法: 定长顺序存储表示: 用一组地址连续的存储单元存储串的字符序列,每一个串变量都有一个固定长度的存储区,可用定长数组来描述 ...

  6. javascript实现数据结构:广义表

    原文:javascript实现数据结构:广义表  广义表是线性表的推广.广泛用于人工智能的表处理语言Lisp,把广义表作为基本的数据结构. 广义表一般记作: LS = (a1, a2, ..., an ...

  7. javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例

    栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...

  8. JavaScript 版数据结构与算法(二)队列

    今天,我们要讲的是数据结构与算法中的队列. 队列简介 队列是什么?队列是一种先进先出(FIFO)的数据结构.队列有什么用呢?队列通常用来描述算法或生活中的一些先进先出的场景,比如: 在图的广度优先遍历 ...

  9. JavaScript系列-----对象基于哈希存储(<Key,Value>之Value篇) (3)

    JavaScript系列-----Objectj基于哈希存储<Key,Value>之Value 1.问题提出 在JavaScript系列-----Object之基于Hash<Key, ...

随机推荐

  1. Keil的使用方法 - 常用功能(二)

    Ⅰ.概述 上一篇文章是总结关于Keil使用方法-常用功能(一),关于(文件和编译)工具栏每一个按钮的功能描述和快捷键的使用. 我将每一篇Keil使用方法的文章都汇总在一起,回顾前面的总结请点击下面的链 ...

  2. DM9000网卡的基本工作原理

    MAC:主要负责数据帧的创建,数据差错,检查,传送控制等. PHY:物理接口收发器,当收到MAC过来的数据时,它会加上校验码,然后按照物理层的规则进行数据编码,再发送到传输介质上,接收过程则相反. M ...

  3. django笔记

    apt-get install libmysqlclient-devpip install mysqlclientsudo apt-get install libxml2-dev libxslt1-d ...

  4. 《Prism 5.0源码走读》Bootstrapper

    Prism框架需要在应用程序启动的时候进行一些初始化的工作,Bootstrapper就是来做这些的,是其切入点. Bootstrapper主要要做的事有:创建和配置module catalog,创建D ...

  5. SQL语句基础之 单表查找

    Sql语句之 单表查询 一.一般查询 1.查看表中的所有记录 以及 所有字段(属性) 语句 : select * from student; 2.只查看某些字段 语句:select sname,sex ...

  6. Erlang generic standard behaviours -- gen_server module

    在分析完gen module (http://www.cnblogs.com/--00/p/4271386.html)之后,就可以开始进入gen_server 的主体module 了.gen_serv ...

  7. 使用angular封装echarts

    Echarts是一个开源的图表组件,图表比较丰富,工作中需要用到它来搭建一个数据展示系统.但是系统原有的框架是基于angular的,而echarts是基于原生js的,如果直接使用的话就丢失了angul ...

  8. Entity Framework 插入数据出现重复插入(导航属性硬是要查再一遍???????)

    问题: Artist artmodel = new Artist(); artmodel.user = uinfo; _artiests.Add(artmodel); 新增一条Artist记录,但是同 ...

  9. JS跨域方法及原理

        JS跨域分析判断 JS跨域:在不同域之间,JS进行数据传输或通信.比如ajax向不同的域请求数据.JS获取iframe中的页面中的值(iframe内外不同域) 只要协议.端口.域名有一个不同则 ...

  10. java数据结构和算法------合并排序

      package iYou.neugle.sort; public class Merge_sort { public static void MergeSort(double[] array, i ...