关闭

js 实现栈和队列

时间: 2018-11-05阅读: 1262标签: js知识

js实现栈或者队列有两种方式:  


1.数组:数组本身提供栈方法(push,pop),队列方法(push,shift)。 

代码实现(栈):

/*=======栈结构=======*/
var stack=function(){
    this.data=[]

    this.push=push
    this.pop=pop

    this.clear=clear
    this.length=length
}
var push=function(element){
    this.data.push(element)
}
var pop=function(){
    this.data.pop()
}
var clear=function(){
    this.data.length=0
}
var length=function(){
    return this.data.length;
}
//测试
var s=new stack()
s.push(‘first‘)
s.push(‘second‘)
console.log(s)
s.pop()
console.log(s)
// s.clear()
console.log(s)

代码实现(队列): 

/*=======队列结构=======*/
var queue=function(){
    this.data=[]

    this.enQueue=enQueue
    this.deQueue=deQueue

    this.clear=clear
    this.length=length
}
var enQueue=function(element){
    this.data.push(element)
}
var deQueue=function(){
    this.data.shift()
}
var clear=function(){
    this.data.length=0
}
var length=function(){
    return this.data.length;
}
//测试
var q=new queue()
q.enQueue(‘first‘)
q.enQueue(‘second‘)
console.log(q)
q.deQueue()
console.log(q)
q.clear()
console.log(q)


 2.链表:构造链表结构,说白了就是链表的插入(尾插),移除(栈:末尾节点移除,队列:头结点移除)

代码实现(栈): 

/*=====栈结构========*/
var node=function(data){
    this.data=data
    this.next=null
}
var stack=function(){
    this.top=new node("top")

    this.push=push
    this.pop=pop

    this.clear=clear
    this.length=length
}

/*=======入栈=======*/
var push=function(data){
    let newNode=new node(data)
    newNode.next=this.top
    this.top=newNode
}
/*=======出栈=======*/
var pop=function(){
    let curr=this.top
    this.top=this.top.next
    curr.next=null
}
/*=======清空栈=======*/
var clear=function(){
    this.top=new node(‘top‘)
}
/*=======栈长度=======*/
var length=function(){
    let cnt=0
    while(this.top.data!==‘top‘){
        this.top=this.top.next
        cnt++
    }
    return cnt

}
/*=======测试=======*/
var s=new stack()
s.push(‘first‘)
s.push(‘second‘)
console.log(s)
s.pop()
console.log(s)
// s.clear()
console.log(s.length())

代码实现(队列): 

/*=====队列结构========*/
var node=function(data){
    this.data=data
    this.next=null
}
var queue=function(){
    this.top=new node("top")

    this.enQueue=enQueue
    this.deQueue=deQueue
}

/*=======入队=======*/
var enQueue=function(data){
    let newNode=new node(data)
    newNode.next=this.top
    this.top=newNode
}
/*=======出队=======*/
var deQueue=function(){
    let curr=this.top
    while(curr.next.next!==null && curr.next.next.data!==‘top‘){
        curr=curr.next
    }
    if(curr.next.next.data===‘top‘){
        curr.next=curr.next.next
    }
}

/*=======测试=======*/
var q=new queue()
q.enQueue(‘first‘)
q.enQueue(‘second‘)
console.log(q)
q.deQueue()
console.log(q)


原文地址:https://www.cnblogs.com/xingguozhiming/p/9906752.html  

 

站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: http://www.fly63.com/article/detial/1261

js变量引用(指针)

基本类型:Number,Boolen,null,String,Underfined 存放在栈内存中,数据长度是固定的。引用类型:Object存在堆内存中,数据长度是变化的(同时有栈内存中有一个指针指向这个Object的)。

javascript的Object. hasOwnProperty方法

hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中(非继承属性)是否具有指定的属性,如果 object 具有带指定名称的属性,则 hasOwnProperty 方法返回 true,否则返回 false。

js中void 0 与 undefined

偶然看到一个问题:为什么有的编程规范要求用 void 0 代替 undefined?如果不知道这个答案的小伙伴,第一反应就要问void 0是什么鬼?

classList的使用,原生js对class的添加,删除,修改等方法的总结,以及兼容操作

classList是一个DOMTokenList的对象,用于在对元素的添加,删除,以及判断是否存在等操作。以及如何兼容操作

深入理解Javascript中apply、call、bind方法的总结。

apply 、 call 、bind 三者都是用来改变函数的this对象的指向的;第一个参数都是this要指向的对象,也就是想指定的上下文;都可以利用后续参数传参;bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用 。

JavaScript中奇特的~运算符

本次分享一下并不是很常用的按位非运算符~的原理以及一点点用法。产生式 UnaryExpression : ~ UnaryExpression 按照下面的过程执行:令 expr 为解释执行 UnaryExpression 的结果。令 oldValue 为 ToInt32(GetValue(expr))。返回 oldValue 按位取反的结果。

适配器在JavaScript中的体现

适配器设计模式在JavaScript中非常有用,在处理跨浏览器兼容问题、整合多个第三方SDK的调用,都可以看到它的身影。适配器模式是一种软件设计模式,允许从另一个接口使用现有类的接口。它通常用于使现有的类与其他类一起工作,而无需修改其源代码。

await在forEach不起作用解决

我们知道await这个机制肯定是没问题的,如果真的有问题肯定不会轮到我测出来,那么其实剩下来的问题只能是for遍历的原因了。lodash的forEach和[].forEach不支持await,如果非要一边遍历一边执行await,可使用for-of

js基础_如何理解作用域和作用域链?

作用域外,无法引用作用域内的变量;离开作用域后,作用域的变量的内存空间会被清除,比如执行完函数或者关闭浏览器,作用域与执行上下文是完全不同的两个概念。我曾经也混淆过他们,但是一定要仔细区分。JavaScript代码的整个执行过程,分为两个阶段,代码编译阶段与代码执行阶段。

javascript中的依赖注入

使用没有依赖的模块,显然这是很难实现的。即使你创建了很好的像黑盒一样的组件,但总有个将所有部分合并起来的地方。这就是依赖注入起作用的地方,当前来看,高效管理依赖的能力是迫切需要的,本文总结了原作者对这个问题的看法。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!