JS-栈常见操作

JavaScript016

JS-栈常见操作,第1张

<!doctype html>

<html lang="en">

    <meta charset="UTF-8">

    <meta name="viewport"

          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">

    <meta http-equiv="X-UA-Compatible" content="ie=edge">

  function Stack(){

//栈中的属性

      this.items=[]

//    栈的相关操作

  //  1.将元素压入栈,两种方法!第二种方法好啊!,第一种方法是对某个实例添加了方法,第二种方法是对某个类添加了方法!共享!

  //    this.push=function (){}

      Stack.prototype.push= (element)=>{

this.items.push(element)

}

// 2.将栈中的元素取出来

      Stack.prototype.pop=()=>{

return this.items.pop()

}

//    3.查看栈中的元素

      Stack.prototype.peek=()=>{

return this.items[this.items.length-1]

}

//    4.判断栈是否空

      Stack.prototype.isEmpty=()=>{

return  this.items.length===0

      }

//    5.获取栈中元素的个数

      Stack.prototype.size=()=>{

return this.items.length

      }

//    6.toString的方法

      Stack.prototype.toString=()=>{

//    20 10 12 8 7

          let resultString=''

          for (let i=0i

resultString +=this.items[i]+' '

          }

return resultString

}

}

//  栈的使用

//  验证!

  let s=new Stack()

s.push(20)

s.push(10)

s.push(100)

s.push(77)

alert(s)

s.pop()

s.pop()

alert(s)

alert(s.peek())

alert(s.isEmpty())

alert(s.size())

</html>

结果显示:

成功实现!

首先,你给出的这个函数 是个严重有缺陷的调用,他会无限递归最终内存溢出,

其次 你这段代码是要运行在什么地方,如果运行在浏览器中,不同浏览器解析到这段代码都会主动报错,不会调用,如果你运行在node环境,这段代码运行会依照你物理内存大小 和系统内存分配方法进行调用 最终爆掉,很显然,你的问题没有完整的条件

记录这个调用也很简单,在函数外部声明一个变量 并且赋值为0;并且在调用的时候给这个变量做自增操作,最后的数据就是完成调用到溢出的调用次数。

关于内存结构,假设一个 数据类型是整数,8字节 ,这句话本身就是个问题,首先Var A = 1这是声明了一个 类型为整数的 变量,这个时候 他在栈中声明了一个东西叫A 同时 指向了池的1 所以 这个8字节代表了2部分,他的栈空间占用就是最终调用函数的次数;不管是什么数据类型,变了的声明都是在栈中,数据都在池里面。如果只是声明了 var A 但是并不赋值,此时他在内存结构中 只会占用栈空间,但是没有数据类型;跟没有整数,字符串,数组,对象,undiluted,这样的数据类型之分了。

我个人觉得,这要么是一个非常刁钻的考试题,要么就是不知道谁脑子有毛病想出来的,显然这是一个非常不科学的题目,实际情况程序是根本跑不起来的,