一、概念
数据结构是由某一数据对象及组成该对象的数据元素之间的关系组成。
二、分类
数据结构按照不同维度分为逻辑结构和存储结构。逻辑数据结构表示数据之间的逻辑关系,存储数据结构表示逻辑数据结构在计算机中的存储方式。根据不同的表示方法(顺序映像和非顺序映像)存储结构又分为顺序存储结构和链式存储结构。一个逻辑数据结构有多种存储数据结构,不同的存储数据结构有不同的效率。算法的设计取决于逻辑数据结构,实现于存储数据结构。
1.逻辑数据结构
逻辑数据结构分为线性结构与非线性结构。
线性结构:数组、栈、列队、表(线性结构是一对一的关系)
非线性结构:树(树是一种一对多的层次结构)、图(图是一种多对多的网状结构)
2.存储数据结构
存储数据结构根据不同的表示(映像)方法分为顺序存储结构、链式存储结构、索引存储结构、散列存储结构。
顺序存储结构指节点与节点之间的物理存储关系。
链式存储结构指节点与节点的指针的逻辑存储关系。
索引存储结构指除了建立节点外,还需要附带建立索引表信息。
散列存储结构指根据节点的关键字直接计算出节点的地址。
三、常用数据结构
数组:
- 数组的概念:按顺序排列的同类元素的集合。
栈:
- 栈的概念:后进先出的存储方式,只能进行删除和添加操作。
- 栈在生活中的运用:比如生活中的羽毛球存放方式,最后放进去的,会被最先拿出来使用。
再比如坐电梯,最后进电梯的人往往最先出来。
- 栈的方法:
1. push 添加元素
2. pop 弹出栈顶元素
3. top 返回栈顶元素
4. isEmpty 判断栈是否为空
5. size 返回栈元素个数
6. clear 清空栈
- 使用数组存储方式定义栈:
function stack(){
var arr = [];
this.push = function(item){
arr.push(item);
};
this.pop = function(){
arr.pop()
};
this.clear = function(){
arr = [];
};
this.top = function(){
return arr[arr.length-1]
};
this.isEmpty = function(){
return arr.length == 0;
};
this.size = function(){
return arr.length;
}
}
- 栈的实现:
判断括号是否成对出现。比如 '(3dfr)fd()' 就是合法, '(3dfr)fd())' 就是不合法。
思路:如果遇到左括号,就将其压入到栈中,如果遇到右括号,就删除栈中的元素,如果最后栈中元素为空,则合法,否则不合法。
function isLegal() {
var obj =new stack();
for(var i = 0;i<str.length;i++){
if(str[i].indexOf('(')>-1){
obj.push('(');
}
if(str[i].indexOf(')')>-1 && !obj.isEmpty()){
obj.pop();
}else {
return false
}
}
return obj.isEmpty();
}
console.log(isLegal());
列队:
- 列队的概念:先进先出;头部删除,尾部插入;无元素时为空列队。
链表:
- 链表的概念:由节点组成的线性数据集合,每个节点由两部分组成:当前节点元素和指向下一个元素的指针,所以节点可以通过指针指向下一个节点。
树:
- 树的概念:一个节点可以有多个子节点。
堆:
- 堆的概念:每个节点都有一个值,根节点的值最小或最大。
图:
- 图的概念:由节点的有穷集合和边的集合组成。
散列表(哈希表):
- 散列表的概念:通过关键字存储表数据。
未完待续,持续更新。