资讯专栏INFORMATION COLUMN

JS-实现入栈出栈

JiaXinYi / 2209人阅读

摘要:实现入栈出栈什么是栈栈是一种遵循后进先出原则的有序集合。新添加的或者待删除的元素都保存在栈的尾部即栈顶,另一端叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。实现入栈出栈的方法方法一是创建一个类来表示栈。

JS-实现入栈出栈 1、什么是栈

栈是一种遵循 后进先出(LIFO) 原则的有序集合。新添加的或者待删除的元素都保存在栈的尾部(即栈顶),另一端叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。

2、实现入栈出栈的方法

方法一是创建一个Stack类来表示栈。具体代码如下:

</>复制代码

  1. function Stack() {
  2. var items = [];
  3. // 添加一个(或几个)新元素到栈顶
  4. this.push = function(ele) {
  5. items.push(ele);
  6. };
  7. // 移除栈顶的元素,同时返回被移除的元素
  8. this.pop = function() {
  9. return items.pop();
  10. };
  11. // 返回栈顶的元素,不对栈做任何修改
  12. this.peek = function() {
  13. return items[items.length - 1];
  14. };
  15. // 判断栈里使是否还有元素
  16. this.isEmpty = function() {
  17. return items.length == 0;
  18. };
  19. // 移除栈里所有的元素
  20. this.clear = function() {
  21. items = [];
  22. };
  23. // 返回栈里的元素个数
  24. this.size = function() {
  25. return items.length;
  26. };
  27. this.print = function() {
  28. console.log(items.toString());
  29. };
  30. }
  31. var stack = new Stack();
  32. console.log(stack.isEmpty());
  33. stack.push(1);
  34. stack.push(8);
  35. console.log(stack.peek());
  36. stack.push(10);
  37. console.log(stack.peek());
  38. console.log(stack.size());
  39. console.log(stack.isEmpty());
  40. console.log(14)
  41. stack.pop();
  42. stack.pop();
  43. stack.print();

另一种方式就是通过push将元素推入栈顶,然后遍历栈里的内容,删除栈顶元素,因为在栈顶元素被删除的时候,数组的长度是一直在变化的,所以要先将数组的长度赋值给len,来确保每次删除的是栈顶元素

</>复制代码

  1. function stack2 () {
  2. var arr = []
  3. for(let i = 0; i < 5; i ++){
  4. var temp = i + 1;
  5. arr.push(temp)
  6. console.log(temp + "入栈")
  7. console.log(arr)
  8. }
  9. console.log("arr内容:" + arr)
  10. var len = arr.length
  11. for(let i = 0; i < len; i++) {
  12. console.log("当前栈的长度:" + arr.length)
  13. console.log("删除栈顶元素:" + arr.pop())
  14. }
  15. }
  16. stack2()
3、入栈出栈的实际应用

栈的实际应用之一就是实现十进制转化为任意进制
以十进制转化为二进制为例:要把十进制转化成二进制,我们可以将十进制数字和2整除(二进制是蛮二进一),直到结果是0为止。其转化过程大致如下:

</>复制代码

  1. // 将十进制转为任意进制
  2. function baseConerter(decNumber, base){
  3. var remStack = new Stack(),
  4. rem,
  5. baseString = "",
  6. digits = "0123456789ABCDEF"
  7. while (decNumber > 0) {
  8. rem = Math.floor(decNumber % base)
  9. remStack.push(rem)
  10. decNumber = Math.floor(decNumber / base)
  11. }
  12. while (!remStack.isEmpty()){
  13. baseString += digits[remStack.pop()]
  14. }
  15. console.log("baseString:" + baseString)
  16. return baseString
  17. }
  18. baseConerter(223411, 2) // 110110100010110011
  19. baseConerter(223411, 8) // 664263
  20. baseConerter(223411, 16) // 368B3

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107553.html

相关文章

  • 栈和队列 - Algorithms, Part I, week 2 STACKS AND QUEUE

    摘要:在改进前使用数组的一个缺点是必须声明数组的大小,所以栈有确定的容量。待解决的问题建立一个能够增长或者缩短到任意大小的栈。下边的图是观察时间开销的另一种方式,表示了入栈操作需要访问数组的次数。 前言 上一篇:算法分析下一篇:基本排序 本篇内容主要是栈,队列 (和包)的基本数据类型和数据结构文章里头所有的对数函数都是以 2 为底关于性能分析,可能还是需要一些数学知识,有时间可以回一下在很多...

    Stardustsky 评论0 收藏0
  • leetcode232 Implement Queue using Stacks

    摘要:题目要求通过队列实现一个栈的功能。栈的为压入栈顶,出栈,栈顶元素,栈是否为空。重复上述的操作。但是当需要弹出元素时,则从桶弹出。这样,下次加入的元素必然全部位于桶后的所有元素,而桶中的元素也能保证位输入顺序。极大的减少了不必要的入栈出栈。 题目要求 Implement the following operations of a queue using stacks. push(x) ...

    golden_hamster 评论0 收藏0
  • 基于JavaScript的简单解释器实现(一)——表达式的语法树生成

    摘要:语法树这一章主要是完成语法树的生成。其中由于函数声明部分过于简单,没必要生成语法树,打算留到下一章一起处理。主循环结束后数据栈中的第一位元素则为语法树。这是最后生成的语法树总结总之,语法树就算是生成完毕了。 前言 这个系列是关于CodeWars上的一条1Kyu题:Simple Interactive Interpreter。也就是实现一个简单的交互式解释器。题目地址:http://ww...

    DataPipeline 评论0 收藏0
  • 以最简单的例子,深入剖析函数如何进行初始化工作,入栈出栈全过程

    摘要:在一个函数中的内容执行前会做一些变量的初始化工作,就是图中下的内容。输出完后,函数出栈,函数变为活动状态,因为没有返回值,所以仍然为同时执行下一语句,如下图执行与相同,先是函数入栈,输出然后将返回值赋给后出栈。 window.onload = function(){ debugger; var variable1,//定义变量1但没有赋值...

    lastSeries 评论0 收藏0
  • 结合作用域,执行上下文图解闭包

    摘要:作用域链所谓作用域链,是由当前环境与上层环境的一系列变量对象组成,它保证当前执行环境对符合访问权限的变量和函数的有序访问。当我们在执行函数的时候,需要的变量,在自己的作用域内找不到,便会顺着作用域链往上找,直到找到全局作用域。 一 作用域相关      作用域是一套规则,用来管理引擎如何查找变量。在es5之前,js只有全局作用域及函数作用域。es6引入了块级作用域。但是这个块级别作用域...

    msup 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<