javascript数据结构系列(三)-栈
来源:互联网 发布:js给div添加style属性 编辑:程序博客网 时间:2024/06/05 11:43
记在前面
昨天实际已经把栈的实现方式写完了,但是昨晚时间比较晚,没有来得及写博客,今天连上今天的内容一起补上。
栈
1. 定义:栈(stack)是限定仅在表位进行插入或删除操作的线性表。因此对于栈来说,表尾端尤其特殊含义,称为栈顶,响应的,表头端称为栈底。不含元素的空表称为空栈。
假设栈S=(a1,a2,⋅⋅⋅,an) ,则称a1 为栈底元素,an 为栈顶元素。栈中元素按照a1,a2,⋅⋅⋅,an 的次序进栈,退栈的第一个元素应为栈顶元素。换句话说,栈的修改是按后进先出的原则进行的,如图。因此栈又称为后进先出的线性表(简称LIFO结构)。
2. 栈的表示和实现
在javascript中,我们选用数组来模拟栈
//用数组存贮栈元素function Stack(){ this.item = []; this.top = 0;};
相应的就有栈的操作
Stack.prototype={ //入栈操作 push:function(element){ this.item[this.top++] = element; }, //出栈操作 pop:function(){ this.top--; return this.item.pop(); }, //返回栈顶元素,但不删除 peek:function(){ return this.item[this.item.length - 1]; }, //是否为空 isEmpty:function(){ if(this.item.length === 0){ return true; } return false; }, //清空栈 clear:function(){ this.item = []; }, //返回栈的长度 size:function(){ return this.item.length; }, //显示函数 display:function(){ var k = this.item.length; for(var i = 0;i<k;i++){ console.log(this.item[i]); } },}
栈后进先出的特性决定了某些操作使用栈会显得非常容易,举例如下:
第一个例子是一个进制转换的操作
function conversion(radix,num){ //对于输入的任意一个非负十进制整数,打印输出与其等值的非十进制数; var Sb = new Stack(); while(num !== 0){ Sb.push(num % radix); num = Math.floor(num / radix); } while(!Sb.isEmpty()){ console.log(Sb.pop()); }}//没有考虑十六进制等大于十进制的情况
第二个例子是括号匹配的问题
括号匹配的思路:假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,即()或[([][])]等都为正确的格式,[(])或([())或(()])均为不正确的格式。检验括号是否匹配的方法可用“期待的急迫程度”这个概念来描述。例如考虑如下括号序列:
[ ( [ ] [ ] ) ]
12345678
当计算机接受了第一个括号后,它期待着与其匹配的第八个括号的出现,然而等来的却是第二个括号,此时第一个括号“[”只能暂时靠边,而迫切等待与第二个括号相匹配的、第七个括号“)”的出现,类似的,因等来的是第三个括号“[”,其期待匹配的程度较第二个括号更急迫,则第二个括号也只能靠边,让位于第三个括号,显然第二个括号的期待急迫性高于第一个括号;在接受了第四个括号之后,第三个括号的期待得到满足,消解之后,第二个括号的期待匹配就成为当前最急迫的任务了,······依次类推,可见这个处理过程恰好与栈的特点相吻合。由此,在算法中设置一个栈,每读入一个括号,若是右括号,则或者使置于栈顶的最急迫的期待得以消解,或者使不合法的情况;若是左括号,则作为一个新的更急迫的期待压入栈中,自然使原有的在栈中的所有未消解的期待的的急迫性都降了一级。另外,在算法的开始和结束时,栈都应该是空的。
function parenthesisMatch(item){ //我似乎没有找到js的输入函数,所以使用一个item参数代表传进来的括号组 //此时函数返回缺少的括号 //只需判断最后是否是空栈即可判断括号是不是完全匹配,若不是,返回最上层的元素 //首先要把传进来的字符串分割 var newArray = []; for(var i = 0;i<item.length;i++){ var j = i; var k = ++j; var newItem = item.substring(i,k); newArray.push(newItem);;//两个参数,一个是起始位置,一个是终点位置 }; //console.log(newArray); //建立一个栈,用来匹配括号 var Sd = new Stack(); //先把newArry的元素压栈->左括号压进栈,右括号则判断栈内是否有对应的左括号,若没有,则不合法 for(var i = 0;i<newArray.length;i++){ var item = newArray[i]; if(item == "{"||item =="["||item =="("){ Sd.push(item); }else if(item == "}"||item =="]"||item ==")" ){ if(item == "}"){ if(Sd.peek() != "{"){ console.log("不合法的'}'"); return false; } Sd.pop(); }else if(item == "]"){ if(Sd.peek() != "["){ console.log("不合法的']'"); return false; } Sd.pop(); }else{ if(Sd.peek() != "("){ console.log("不合法的')'"); return false; } Sd.pop(); } } } if(Sd.isEmpty()){ console.log("通过匹配") }else{ console.log("不通过匹配") }; };
后记
昨天主要完成了栈的实现,包括各种方法,今天主要是就以上几种方法实现了两个例题
阅读全文
0 0
- javascript数据结构系列(三)-栈
- 学习Javascript数据结构与算法系列笔记(三):集合
- 数据结构系列教程(三)
- 数据结构系列(三)链表
- JavaScript系列(三:函数)
- 学习Javascript数据结构与算法系列笔记(二):栈
- javascript数据结构系列(一)-线性表
- javascript数据结构系列(四)-队列
- javascript数据结构系列(五)-串
- Redis系列(三)Redis数据结构
- 数据结构知识点系列三
- JavaScript难点系列(三):异步编程
- 数据结构:(三)栈
- javascript数据结构系列(二)-线性表(1)
- javascript数据结构系列(二)-线性表(2)
- javascript数据结构系列(五)-串(2)
- javascript数据结构系列(五)-串(3)
- javascript数据结构系列(六)-二叉树(2)
- Scala基础入门(十三 ) 类、函数参数形式、种类、使用方式总结
- HTML菜鸟入门4
- Socket编程 ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。
- Java开发者的10个大数据工具和框架
- ZOJ 1141 Closest Common Ancestors(LCA)
- javascript数据结构系列(三)-栈
- Postman入门教程【没有废话,直入实战,绝对给力!】
- 数据库SQL实战-答案解析(1-15)
- POJ-2157:Maze(特殊的bfs方式)
- python-设计模式-索引
- 一个简单无脑的防止内存重启后导致Fragment重叠的解决办法
- 网络管理(四)
- memcache与redis区别
- Java里面线程池,及常用四种线程池的使用