JavaScript中常见数据结构

数据结构

  • :一种遵从先进后出 (LIFO) 原则的有序集合;新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端为栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。
  • 队列:与上相反,一种遵循先进先出 (FIFO / First In First Out) 原则的一组有序的项;队列在尾部添加新元素,并从头部移除元素。最新添加的元素必须排在队列的末尾。
  • 链表:存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的;每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(指针/链接)组成。
  • 集合:由一组无序且唯一(即不能重复)的项组成;这个数据结构使用了与有限集合相同的数学概念,但应用在计算机科学的数据结构中。
  • 字典:以 [键,值] 对为数据形态的数据结构,其中键名用来查询特定元素,类似于 Javascript 中的Object
  • 散列:根据关键码值(Key value)直接进行访问的数据结构;它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度;这个映射函数叫做散列函数,存放记录的数组叫做散列表。
  • :由 n(n>=1)个有限节点组成一个具有层次关系的集合;把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的,基本呈一对多关系,树也可以看做是图的特殊形式。
  • :图是网络结构的抽象模型;图是一组由边连接的节点(顶点);任何二元关系都可以用图来表示,常见的比如:道路图、关系图,呈多对多关系。

生活中常见的Stack的例子比如一摞书,你最后放上去的那本你之后会最先拿走;又比如浏览器的访问历史,当点击返回按钮,最后访问的网站最先从历史记录中弹出。

Stack一般具备以下方法:

  1. push:将一个元素推入栈顶
  2. pop:移除栈顶元素,并返回被移除的元素
  3. peek:返回栈顶元素
  4. isEmpty(): 栈中是否有元素
  5. clear(): 移除栈中所有元素
  6. size:返回栈中元素的个数

以对象形式实现栈

    <script type="text/javascript">
        function Stack() {
            this.count = 0;
            this.storage = {};
            //将一个元素推入栈顶
            this.push = function (value) {
                this.storage[this.count] = value;
                this.count++;
            }
            //移除栈顶元素,并返回被移除的元素
            this.pop = function () {
                if (this.count === 0) {
                    return undefined;
                }
                this.count--;
                var result = this.storage[this.count];
                delete this.storage[this.count];
                return result;
            }
            //返回栈顶元素
            this.peek = function () {
                return this.storage[this.count - 1];
            }
            //栈中是否有元素
            this.isEmpty = function () {
                //使用es6语法判断对象中属性长度
                //return Object.keys(this.storage).length==0;
                return this.count==0;
            }
            //移除栈中所有元素
            this.clear = function () {
                this.count = 0
                //return this.storage={};
            }
            //返回栈中元素的个数
            this.size = function () {
                return this.count;
            }
        }


        var newStack = new Stack();
        newStack.push("第一个元素");
        newStack.push("第二个元素");
        newStack.push("第三个元素");
        console.log("打印栈中元素个数:" + newStack.size());
        console.log("打印栈中栈顶元素:" + newStack.peek());
        console.log("打印栈中移除元素:" + newStack.pop());
        console.log("移除栈顶元素后再次打印栈中栈顶元素:" + newStack.peek());
        console.log("判断栈中是否有元素:" + newStack.isEmpty());
        console.log("移除栈中所有元素:" + newStack.clear());
        console.log("移除后判断栈中是否有元素:" + newStack.isEmpty());
        console.log("打印栈中移除元素:" + newStack.pop());
    </script>

以数组形式实现栈

    <script type="text/javascript">
        function Stack() {
            //保存栈内元素的数组
            this.dataStore = [];
            //top用来记录栈顶位置,初始化为0        
            this.top = 0;

            this.push = function (element) {
                this.dataStore[this.top++] = element;   // 先在top位置加入元素,之后top加1
            }
            this.pop = function () {
                // top先减1,然后返回top位置的元素
                return this.dataStore[--this.top];
            }
            this.peek = function peek() {
                return this.dataStore[this.top - 1];
            }

            
            this.isEmpty = function clear() {
                return this.top ==0;
            }

            this.clear = function clear() {
                this.top = 0;
            }

            this.length = function length() {
                return this.top;
            }
        }
        var newStack = new Stack();
        newStack.push("第一个元素");
        newStack.push("第二个元素");
        newStack.push("第三个元素");
        console.log("打印栈中元素个数:" + newStack.length());
        console.log("打印栈中栈顶元素:" + newStack.peek());
        console.log("打印栈中移除元素:" + newStack.pop());
        console.log("移除栈顶元素后再次打印栈中栈顶元素:" + newStack.peek());
        console.log("判断栈中是否有元素:" + newStack.isEmpty());
        console.log("移除栈中所有元素:" + newStack.clear());
        console.log("移除后判断栈中是否有元素:" + newStack.isEmpty());
    </script>

队列

与栈相反,队列是一种遵循先进先出 (FIFO / First In First Out) 原则的一组有序的项;队列在尾部添加新元素,并从头部移除元素。最新添加的元素必须排在队列的末尾。·

在现实中,最常见的例子就是排队,吃饭排队、银行业务排队、公车的前门上后门下机制...,前面的人优先完成自己的事务,完成之后,下一个人才能继续。

在计算机科学中,一个常见的例子就是打印队列。比如说我们需要打印五份文档。我们会打开每个文档,然后点击打印按钮。每个文档都会被发送至打印队列。第一个发送到打印队列的文档会首先被打印,以此类推,直到打印完所有文档。·

同样的,我们在 Javascript 中实现一个队列类。

猜你喜欢

转载自www.cnblogs.com/zhuochong/p/11627598.html