《数据结构》学习笔记(二)
First talk about JS数组
声明有两种:
一种是new对象:a = new Array(); 数组在js中是对象;
一种是字面量:a= [];
这两种都是声明的是同样一个数组a,所以可以把a= new Array();改为a = [];。
new 对象这种是在内存的堆栈中开空间,所以从性能上说,写字面量比写new Array要更好。所以尽量用字面量声明数组
a = [];这就声明了一个数组 a 里面没内容,这只是数组的声明,就像JS的字符串声明--它是字面量的声明: str = "";
这就是字面量声明
JS数组只支持一维数组,不支持多维数组,但支持数组中的数组:
Code
a = [];
a[0] = [1,2];
console.log(a);
JS数组中的数值数据类型允许不一致:
Code
a = [];
a[0] = [1,2];
a[1] = "string";
a[2] = null;
a[3] = false;
a[4] = 4;
console.log(a);
这是其他编程语言中数组不允许的,如C#中数组只能是一种数据类型。
OK. 上面有关JS数组的预备知识讲完了,接下来是将JS数组与数据结构的栈和队列联系起来的内容了。
数组在数据结构中是线性结构,它是一种线性表,而且是受限的线性表。
字符串也是一种线性表。
栈(stack)就是 之前所说的受限的线性表,限定仅在表尾进行插入或删除操作的线性表。表尾是栈顶。
数组的方法pop()和push()结合一起使用时,它是栈;而shift()和push()结合一起使用时,它是队列。
JS的字符串是个特殊的线性表--有双重身份:具有线性顺序表的特点,却实质上是线性链式表。
因为JS的字符串的插入和删除不是线性链式表的特点,而是线性顺序表的特点。因为线性顺序表非常麻烦,要插入或删除的话必须涉及到位移操作。字符串的插入和删除具有这样的特点。
而线性链式表的插入和删除操作比较而言就简单了。我们看JS字符串的方法,就是要与数组进行转换。
JS字符串是原始数据类型,再次强调下,这是其他编程语言所没有实现的。
JS中的数组 可以与C#中的ArrayList相比,但更像Perl的关联数组,因为它可以for in 出来:
a = [1,2,2,2,null];
for(i in a)
{
console.log(i);
}
我们就数组是队列还是栈来看一看。
a = [1,2,2,2,null];
b = a.pop();
console.log('a 的pop方法: ' + b);
console.log('a: ' + a);
a.push(null);
console.log('push方法后的 a: ' + a);
这时数组是栈。
a = [1,2,2,2,'str'];
b = a.shift();
console.log('a 的shift方法: ' + b);
console.log('a: ' + a);
a.push(3);
console.log('push方法后的 a: ' + a);
这时数组却是队列。
队列“先进先出”,而栈“先进后出”。栈顶的第一个值第一个进,最后一个才出。
a = [1,2,2,2,'str'];
b = a.shift();
console.log('a 的shift方法: ' + b);
console.log('a: ' + a);
a.unshift(1);
console.log('unshift方法后的 a: ' + a);
shift()和unshift()方法是对队头(front)的第一个值进行操作。
push()方法是往栈底压入一个值,它在这个数组中是最后一个值。
栈的栈顶是封口的,所以没有shift()和unshift()的方法,只有栈底的push()和pop()方法。
栈操作与队列操作的区别:
Code
a = [];
b = [];
c = [];
for(i=0;i<10;i++)
{
a[i] = (Math.ceil(100*Math.random()));
}
console.log(a);
for(j=0;j<10;j++)
{
b.push(a[j]);
}
console.log(b);
for(k=0;k<10;k++)
{
c.unshift(a[k]);
}
console.log(c);