前言
昨天写了简单的块存储结构,很多方法没有实现,今天补上。
串的块存储结构
相比较余线性表、栈等数据结构,串的块存储结构比较复杂。今天实现的方法有substring()
,toString()
等,操作比较复杂有点不易理解。
function Chunk(chunkSize){
this.chunkSize = chunkSize || 4;
this.chunk = [];
for(var i = 0; i<this.chunkSize;i++){
this.chunk[i] = '#'
}
this.next = null;
};
exports.LString = LString;
function LString(chunkSize){
this.head = null;
this.tail = null;
this.length = 0;
this.chunkSize = chunkSize || 4;
};
LString.prototype = {
strAssign:function(chars){
this.head = this.tail = new Chunk(this.chunkSize);
this.length = chars.length;
var current = this.head;
for(var i = 0,len = chars.length;i<len;i++){
current.chunk[i % this.chunkSize] = chars[i];
if((i+1 < len) && ((i+1) % this.chunkSize) === 0){
current.next = new Chunk();
current = current.next;
}
}
this.tail = current;
},
strEmpty:function(){
if(this.length === 0){
if(this.head === this.tail){
if(this.head === null){
return true;
}
}
}
return false;
},
strCompare:function(){
var current = this.head;
var curT = tLString.head;
if(this.lenth !== tLString.length){
return false;
}
while(current){
for(var i = 0;i < this.chunkSize;i++){
if(current.chunk[i] !== curT.chunk[i]){
return false;
}
}
current = current.next ;
curT = curT.next;
}
return true;
},
totring:function(){
var current = this.head;
if(current === null){
return '';
};
var str = '';
while(current){
for(var i = 0;i<this.chunkSize;i++){
var ch = current.chunk[i];
if(ch === "#"){
console.log(str);
return str;
}else{
str = str + current.chunk[i];
}
}
current = current.next;
}
console.log(str);
return str;
},
subString:function(pos,len){
pos = ~~pos || 0;
len = ~~len || this.length;
if (pos < 0 || pos > this.length - 1 || len < 0 || len > this.length - pos)
throw new Error('unexpected parameter');
var sub = new LString(this.chunkSize);
var current = findPosChunk(this,pos);
var cur = sub.head = new Chunk(this.chunkSize);
var i = 0;
sub.length = len;
outerloop:while(current){
for(var j = 0,size = this.chunkSize;j<size;j++){
if(i === len){
break outerloop;
}else{
cur.chunk[j] = current.chunk[(i + pos) % this.chunkSize];
i++;
if((i + pos) % this.chunkSize === 0){
current = current.next;
}
if( i % this.chunkSize === 0 && (current.chunk[i] || current.next)){
cur.next = new Chunk(this.chunkSize);
cur = cur.next;
}
}
}
}
console.log(sub);
return sub;
},
contact:function(tLString){
if(!tLString.length){
return ;
}
var ret = new LString(this.chunkSize);
if(this.head === null){
strCopy(ret,tLString);
}else{
ret.head = ret.tail = new Chunk(this.chunkSize);
strCopy(ret,this);
var index = ret.tail.chunk.indexOf("#");
if(index === -1){
strCopy(ret,tLString);
}else{
strCopy(ret,tLString,ret.tail, tLSting.head, index);
}
}
},
};
function findPosChunk(LS,pos){
var current = LS.head;
while(current){
for(var i = 0,len = LS.chunkSize;i<len;i++){
if(pos-- === 0){
console.log(current);
return current;
}
}
current = current.next;
}
};
function strCopy(destination,target,curD,currT,offset){
offset = offset || 0;
currT = currT || target.head;
curD = curD || destination.head;
var k = 0;
while (currT){
for (var i = 0, len = target.chunkSize; i < len; i++, k++) {
var j = k % curD.chunkSize + offset ;
curD.chunk[j % curD.chunkSize] = currT.chunk[i];
if ((j + 1) % curD.chunkSize === 0 && (currT.chunk[i + 1] || currT.next)) {
curD.next = new Chunk(destination.chunkSize);
curD = curD.next;
}
}
currT = currT.next;
}
destination.tail = curD;
destination.length += target.length;
};
后记
以上。