学习Javascript数据结构与算法系列笔记(二):栈

来源:互联网 发布:使用ping命令测试网络 编辑:程序博客网 时间:2024/05/16 09:56

栈是一种遵从后进先出(lifo)原则的有序集合。新添加的或待删除的元素都保存在栈的末尾,称作栈顶,顶一端叫做栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。

栈也被用在编程语言的编译器和内存中保存变量、方法调用等。

1.栈的创建

声明类

function Stack(){  //Declarations of various properties and functions}

选择一种数据结构来保存栈里的元素—–数组

var items = [];

为栈声明一些方法

  • push(ele): 添加一个(或几个)新元素到栈顶。

  • pop(): 移除栈顶的元素,同时返回被移除的元素。

  • peek(): 返回栈顶的元素。

  • isEmpty(): 如果栈为空则返回true,反之返回false。

  • clear(): 移除栈里的所有元素。

  • size(): 返回栈里的元素个数。

完整代码

function Stack(){  var items = [];  //add new elements to stackTop  this.push = function(ele){    items.push(ele);  };  //remove elements of stackTop and return this elements  this.pop = function(){    return items.pop();  };  //return elements of stackTop  this.peek = function(){    return items[items.length - 1];  };  //judge the stack is empty  this.isEmpty = function(){    return items.length == 0;  };  //clear the stack  this.clear = function(){    items = [];  };  //return the stack's length  this.size = function(){    return item.length;  };  //console  this.print = function(){    console.log(items.toString);  };}

使用Stack类

  • 初始化

  • 判断是否为空

  • 添加元素

  • 调用peek方法

  • 调用size方法

  • 输出stack

var stack = new Stack();console.log(stack.isEmpty()); //truestack.push(5);stack.push(8);console.log(stack.peek()); //8stack.push(11);console.log(stack.size()); //3console.log(stack.isEmpty()); //falsestack.push(15);stack.pop();stack.pop();console.log(stack.size()); //2stack.print(); //[5, 8]

2.从十进制到二进制

function divideBy2(decNumber) {  var remStack = new Stack(),  rem,  binaryString = '';  while (decNumber > 0) {     rem = Math.floor(decNumber % 2);     remStack.push(rem);     decNumber = Math.floor(decNumber / 2);   }  while (!remStack.isEmpty()) {     binaryString += remStack.pop().toString();  }  return binaryString;}

在这段代码里,当结果满足和2做整除的条件时,我们会获得当前结果和2的余数,放到栈里。然后让结果和2做整除。另外请注意: JavaScript有数字类型,但是它不会区分究竟是整数还是浮点数。因此,要使用Math.floor函数让除法的操作仅返回整数部分。最后,用pop方法把栈中的元素都移除,把出栈的元素变成连接成字符串。

修改上述代码,改为10进制与任一进制转换

function baseConverter(decNumber, base) {  var remStack = new Stack(),  rem,  digits = '0123456789ABCDEF'; //数字转换 取索引值  baseString = '';  while (decNumber > 0) {     rem = Math.floor(decNumber % base);     remStack.push(rem);     decNumber = Math.floor(decNumber / base);   }  while (!remStack.isEmpty()) {     binaryString += digits[remStack.pop()];  }  return binaryString;}

栈章节结束~~ヾ(◍°∇°◍)ノ゙

下一节队列~~~

阅读全文
0 0
原创粉丝点击