zoukankan      html  css  js  c++  java
  • javascript创建一个基于对象的栈结构

    上篇博客介绍了基于数组创建一个栈,这是用对象创建一个栈

    s1.声明一个Stack类

    class Stack {   
     constructor() {   
            this.count = 0;   
            this.items = {}; 
        } 
    }     
    

      在构造器中定义count属性用来记录栈的大小

    s2.push()方法,向栈内添加元素,只允许一次插入一个元素

    push(element){
      this.items[this.count] =  element;
      this.count++;           
    }
    

     使用 count 变量 作为 items 对象的键名,插入的元素则是它的值。在向栈插入元素后,递增 count 变量

    s3.验证栈是否为空isEmpty() 和栈的大小size()

    要验证栈是否为空,判断 count 的值是否为 0即可;count 属性也表示栈的大小。返回 count 属性的值来实现 size 方法

    isEmpty(){
      return this.count === 0;  
    }
    
    size(){
      return this.count;  
    }
    

    s4.pop()方法,从栈中移除元素并返回

    pop(){
      if (this.isEmpty){
        return undefined;      
    }  
      this.count--;  //count减1,得到栈顶元素的索引
      const result = this.items[this.count];  //保存栈顶元素,以便删除后返回值
      delete this.items.this.count;  //使用delete 删除对象的属性
      return result;
    }
    

    s5.peek()方法,查看栈顶元素

    peek() {   
      if (this.isEmpty()) {
        return undefined;
      }
      return this.items[this.count - 1];
    }

     栈不为空直接返回count - 1位置的元素即可

    s6.clear()清空栈

    要清空该栈,只需要将它的值复原为构造函数中使用的值即可

    clear() {   
      this.items = {};
      this.count = 0;
    }

     或者循环调用pop移除元素 

    while (!this.isEmpty()) {
    this.pop();
    }

     下面开始测试,完整代码可以直接复制:

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4   <meta charset="UTF-8">
     5   <meta name="viewport" content="width=device-width, initial-scale=1.0">
     6   <meta http-equiv="X-UA-Compatible" content="ie=edge">
     7   <title>
     8   
     9   </title>
    10 </head>
    11 <body>
    12     <h1>测试栈</h1>
    13     <script>
    14     class Stack {   
    15          constructor() {   
    16             this.count = 0;   
    17             this.items = {}; 
    18         }
    19         push(element){
    20         this.items[this.count] =  element;
    21         this.count++;           
    22         }
    23         isEmpty(){
    24             return this.count === 0;  
    25         }
    26 
    27         size(){
    28             return this.count;  
    29         }
    30         pop(){
    31             if (this.isEmpty()){
    32                 return undefined;      
    33             }  
    34           this.count--;  //count减1,得到栈顶元素的索引
    35           const result = this.items[this.count];  //保存栈顶元素,以便删除后返回值
    36           delete this.items[this.count];  //使用delete 删除对象的属性
    37           return result;
    38         }
    39         peek() {   
    40           if (this.isEmpty()) {     
    41             return undefined;   
    42           }   
    43           return this.items[this.count - 1]; 
    44         }
    45         clear() {   
    46           this.items = {};   
    47           this.count = 0; 
    48         }
    49     }     
    50     //首先实例化一个栈对象
    51     const stack = new Stack();
    52 
    53     stack.push(12);        //进栈
    54     stack.push(20);
    55     console.log(stack);
    56     console.log(stack.isEmpty());    //输出false
    57     console.log(stack.pop());    //输出20,这里移除了栈顶元素20,并返回了
    58     console.log(stack.peek());    //输出12,这是返回元素,12依然保存在栈中
    59 
    60     console.log(stack.size());    //输出1
    61 
    62     stack.clear();    //清栈,此时栈空了
    63     console.log(stack.isEmpty());    //输出true
    64 </script>
    65 </body>
    66 </html>

    测试结果:

  • 相关阅读:
    递归的一些应用(一)遍历文件夹
    获取指定路径下文件夹所有文件的大小
    JavaScript Color Picker
    在ASP.NET中,用javascript给CuteEditor控件赋值
    通过URL判断文件是否有存在
    语音验证码
    [链接].net 学习网站
    [音乐]梦中的婚礼
    [转载]天堂猎人影院的爱情狩猎
    为应用程序添加消息过滤器
  • 原文地址:https://www.cnblogs.com/cducz/p/11843248.html
Copyright © 2011-2022 走看看