美文网首页
栈数据结构

栈数据结构

作者: 弹指一挥间_e5a3 | 来源:发表于2020-04-23 11:58 被阅读0次

    一、 什么是栈

    栈是一种遵从 后进先出(LIFO)原则的有序集合。新添加或待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。在现实生活中也能发现很多栈的例子。例如,下图里的一摞书或者餐厅里叠放的盘子。

    image.png

    栈也被用在编程语言的编译器和内存中保存变量、方法调用等,也被用于浏览器历史记录(浏览器的返回按钮)。

    二、创建一个基于数组的栈

    class StackArray {
      constructor() {
        this.items = [];
      }
      push(element) {
        this.items.push(element);
      }
    
      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 = [];
      }
    
      toArray() {
        return this.items;
      }
    
      toString() {
        return this.items.toString();
      }
    }
    

    二、创建一个基于对象的 Stack 类

    创建一个 Stack 类最简单的方式是使用一个数组来存储其元素。在处理大量数据的时候(这在现实生活中的项目里很常见),我们同样需要评估如何操作数据是最高效的。在使用数组时,大部分方法的时间复杂度是 O(n)O(n) 的意思是,我们需要迭代整个数组直到找到要找的那个元素,在最坏的情况下需要迭代数组的所有位置,其中的n代表数组的长度。如果数组有更多元素的话,所需的时间会更长。另外,数组是元素的一个有序集合,为了保证元素排列有序,它会占用更多的内存空间。如果我们能直接获取元素,占用较少的内存空间,并且仍然保证所有元素按照我们的需要排列,那不是更好吗?对于使用 JavaScrip t语言实现栈数据结构的场景,我们也可以使用一个 JavaScript 对象来存储所有的栈元素,保证它们的顺序并且遵循 LIFO 原则。

    class Stack {
      constructor() {
        this.count = 0;
        this.items = {};
      }
      push(element) {
        this.items[this.count] = element;
        this.count++;
      }
      pop() {
        if (this.isEmpty()) {
          return undefined;
        }
        this.count--;
        const result = this.items[this.count];
        delete this.items[this.count];
        return result;
      }
      peek() {
        if (this.isEmpty()) {
          return undefined;
        }
        return this.items[this.count - 1];
      }
      isEmpty() {
        return this.count === 0;
      }
      size() {
        return this.count;
      }
      clear() {
        /* while (!this.isEmpty()) {
            this.pop();
          } */
        this.items = {};
        this.count = 0;
      }
      toString() {
        if (this.isEmpty()) {
          return '';
        }
        let objString = `${this.items[0]}`;
        for (let i = 1; i < this.count; i++) {
          objString = `${objString},${this.items[i]}`;
        }
        return objString;
      }
    }
    

    相关文章

      网友评论

          本文标题:栈数据结构

          本文链接:https://www.haomeiwen.com/subject/nkepihtx.html