stack----栈


2020-5-28 前端基础

栈是一种遵守后进先出原则的一种有序集合;新添加或待删除的元素都保存在栈的末尾,叫栈顶,另一端叫栈底;在栈里,新元素都靠近栈顶,旧元素都靠近栈底;栈也被用在编程语言的编译器和内存中保存变量、方法调用等;

栈的创建

 function Stack(){

 }
// 我们创建一个类来表示栈。我们用数组来模拟;
 var list=[];
1
2
3
4
5

接下来需要一点给栈声明一些方法

  • push(): 添加一个或多个新元素到栈顶;
  • pop():移除栈顶的元素,同时返回该移除的元素;
  • peek():返回栈顶的元素;
  • isEmpty():判断栈里面是否存在元素,存在则返回true,不存在就返回false;
  • clear(): 移除栈里的所有元素;
  • size(): 返回栈里元素的个数;

我们根据功能给类里面添加方法;

 function Stack(){
    var list=[];
    //添加push方法;添加元素
    this.push=function(element){
      list.push(element);
    };
    //添加pop方法,移除元素;
    this.pop=function(element){
      list.pop(element);
    };
    //添加peek方法,返回栈顶元素;
    this.peek=function(element){
      return list[list.length-1]
    };
    //isEmpty方法,判断是否有元素;
    this.isEmpty=function(){
      if(!list.length){
        return false;
      }
      return true;
    };
    //clear:清除栈元素
    this.clear=function(){
      list=[];
    }
    //size:返回栈的元素个数
    this.size=function(){
      return list.length;
    }
 }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

从十进制到二进制

上面我们模拟了栈,现在我们就用它来解决从十进制到二进制的转换;

ps: 把十进制转成二进制,是将十进制的数字和2整除,如果余数不为零就继续用余数和2进行整除,直到结果为0为止;

10/2=5       rem===0;
5/2=2        rem===1;
2/2=1        rem===0;
1/2=0        rem===1;

将结果从下往上放入栈中,然后输出;
1
2
3
4
5
6

那么,我们如何模拟实现这个方法呢?

function divideBy2(decNumber){
    let remStack = new Stack();
    let rem,str='';
    while(decNumber>0){
      rem = Math.floor(decNumber%2);//取余数;
      remStack.push(rem);//将余数放入栈中;
      decNumber=Math.floor(decNumber/2);//此时数字应该变成未除尽的数;
    }
    while(!remStack.isEmpty()){
      str += remStack.pop().toString();
    }
    return str;
  }
  console.log(divideBy2(10))
1
2
3
4
5
6
7
8
9
10
11
12
13
14

我们很容易修改上面的算法,使函数变成能把十进制转成任意进制的;

function divideBy2(decNumber,base){
    let remStack = new Stack();
    let rem,str='',digits='0123456789ABCDEF';
    while(decNumber>0){
      rem = Math.floor(decNumber%base);//取余数;
      remStack.push(rem);//将余数放入栈中;
      decNumber=Math.floor(decNumber/base);//此时数字应该变成未除尽的数;
    }
    while(!remStack.isEmpty()){
      str += digits[remStack.pop()];
    }
    return str;
  }
  console.log(divideBy2(100345,16))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Thomas: 5/29/2020, 5:16:48 PM