最简单的数据结构与算法(一)栈

587 阅读2分钟

栈-什么是栈???

概念:栈是一种受限制的线性表,是数据结构中一种抽象的数据存储结构,它遵循后进先出的原则 ps:内存中也有栈,栈内存是真实存在的一块内存区给数据结构中的栈不是一个概念,这里不要混搅了,由于栈遵循的是后进先出的原则,所以只能在栈顶添加在栈尾删除,下面让我们具体实现下栈结构

生活中有哪些栈呢,让我们思考下......

例子:比我我们整理好的一摞书籍,是不是需要从最下面开始放,而最上面的可以先取走阅读呢?又或者饭店洗好的一摞盘子,是不是也是从下面开始放,用的时候从最上面取呢?那么我们大概就有了栈这个结构了

class Stack {
  constructor() {
  // 声明一个数组用来存储栈数据结构    
    this.items = [];
  }
  //  进栈即添加后添加
  push(ele) {
    this.items.push(ele);
  }
  //  出栈即删除前删除
  pop() {
    return this.items.pop();
  }
  // 返回栈顶元素,其实就是我们数组的最后一位
  peek() {
    return this.items[this.items.length - 1];
  }
  // 判断栈中元素是否为空,其实就是数组长度
  isEmpty() {
    return this.items.length === 0;
  }
  // 获取栈中的元素的个数,同上
  size() {
    return this.items.length;
  }
  // 清空栈
  clear() {
    this.items = [];
  }
}

示例:熟悉的禁止转换问题

可以利用栈将一个数字从一种数制转换成另一种数制。假设想将数字 n 转换为以 b 为基数 的数字,实现转换的算法如下。

  • 最高位为 n % b,将此位压入栈。
  • 使用 n/b 代替 n。
  • 重复步骤 1 和 2,直到 n 等于 0,且没有余数。
  • 持续将栈内元素弹出,直到栈为空,依次将这些元素排列,就得到转换后数字的字符 串形式
function mulBase(num, base) { 
    var s = new Stack(); 
    do {
        s.push(num % base);
        num = Math.floor(num /= base); 
    } while (num > 0); 
    var converted = ""; 
    while (s.length() > 0) { 
        converted += s.pop(); 
    }
    return converted; 
}

可以试下二进制转为八进制额!