JS數據結構:棧,隊列,Set,Map

Stack 棧

var Stack = function(){
    var items = []   
    //私有屬性,禁止直接外部訪問,只能調用接口

    // push 棧頂添加元素
    this.push = function(element){
        items.push(element)
    }
    // pop 移除棧頂元素
    this.pop = function(){
        return items.pop()
    }
    // peek 檢查棧頂
    this.peek = function(){
        return items[items.length - 1]
    }

    // 檢查棧 是否爲空
    this.isEmpty = function(){
        return items.length == 0
    }

    // 清除棧
    this.clear = function(){
        items = []
    }

    // 獲取棧的大小
    this.length = function(){
        return items.length
    }

    // 檢查items
    this.getItems = function(){
        return items
    }
}
複製代碼

Queue 隊列

var Queue = function(){
    var items = []

    //入隊
    this.enqueue = function(element){
        items.push(element)
    }
    // 出隊
    this.dequeue = function(){
        return items.shift()
    }
    //查看隊列頭
    this.front = function(){
        return items[0]
    }

    //檢查隊列是否爲空
    this.isEmpty = function(){
        return items.length === 0
    }

    //隊列大小
    this.size = function(){
        return items.length
    }
}

複製代碼

PriorityQueue 優先隊列

var PriorityQueue = function(){
    var items = []

    // 數據+優先級
    var QueueItem = function(element,priority){
        this.element = element
        this.priority = priority
    }
    
    this.enqueue = function(element,priority){
        var queueItem = new QueueItem(element,priority)

        var added = false
        
        for(var i = 0 ; i < items.length ; i++){
            if(queueItem.priority > items[i].priority){
                items.splice(i,0,queueItem)
                added = true
                break
            }
        }
        if(!added){
            items.push(queueItem)
        }
    }
    this.getItems = function(){
        return items
    }
}
複製代碼

Set 集合

  • 我寫的和網上其餘方法不同,
  • ES6的Set支持去重,並防止對象轉化成爲[object Obeject]
function mySet() {
            var set = [];
            // this.set = set; 
            //製做函數時方便檢查用的
            //避免暴露給用戶

            this.add = function (item) {
                if (!this.has(item)) {
                    console.log(item)
                    set.push([item])
                }
            }

            this.has = function (item) {
                for (var i = 0; i < set.length; i++) {
                    if (set[i][0] === item) {
                        return true;
                    }
                }
                return false;
            }

            this.get = function (item) {
                var arr = [];
                for (var i = 0; i < set.length; i++) {
                    arr.push(set[i][0])
                }
                return arr;
            }

            this.size = function (item) {
                return set.length;
            }

            this.clear = function () {
                items = [];
                return true
            }
            
            if (arguments) {
                for (var i = 0; i < arguments[0].length; i++) {
                    this.add(arguments[0][i])
                }
            }

        }

        // 測試
        var obj = { name: 'obj' }
        var oSet = new mySet([1, 2, obj,{}]);
        oSet.add(function () { });
        oSet.add({ name: "lyz" });
        oSet.add(obj);
        console.log(oSet);

複製代碼

Map 字典

  • 桶 + 哈希 + 鏈表
class myMap {
            constructor() {
                //初始化桶
                this.bucket = new Array(8);
                for (var i = 0; i < this.bucket.length; i++) {
                    this.bucket[i] = {
                        type: 'bucket_' + i,
                        next: null
                    }
                }
            }
            makeHash(key) {
                // 根據類型產生哈希 
                var hash = 0;
                if (typeof key !== 'string') {
                    if (typeof key === 'number') {
                        hash = Object.is(NaN, key) ? 0 : key;
                    } else if (typeof key == 'object') {
                        hash = 0;
                    } else if (typeof key == 'boolean') {
                        hash = +key;
                    } else {
                        //function undefined symbol()
                        hash = 8;
                    }
                } else {
                    //若是是string
                    for (var i = key.length - 1; i > key.length - 4; i--) {
                        if (key[i]) {
                            hash += key[i].charCodeAt(0)
                        }
                    }
                }
                hash = hash % 8;
                console.log(hash)
                return hash;
            }
            get(key) {
                let hash = this.makeHash(key);
                //遊標 桶
                var oTempBucket = this.bucket[hash];

                while (oTempBucket) {
                    if (oTempBucket.next.key == key) {
                        //若是已經存在
                        return oTempBucket.next.value
                    }
                    oTempBucket = oTempBucket.next;
                }
            }
            set(key, value) {
                let hash = this.makeHash(key);
                var oTempBucket = this.bucket[hash];
                while (oTempBucket.next) {
                    //查找
                    if (oTempBucket.next.key == key) {
                        //若是已經存在
                        oTempBucket.next.key == key
                    } else {
                        //若是不存在, 臨時桶的next爲空,下一步跳出循環
                        oTempBucket = oTempBucket.next;
                    }
                }
                //對空桶初始化賦值
                oTempBucket.next = {
                    key,
                    value,
                    next: null
                }
            }
            has(key) {
                let hash = this.makeHash(key);
                //遊標桶
                var oTempBucket = this.bucket[hash];
                while (oTempBucket) {
                    if (oTempBucket.next && oTempBucket.next.key == key) {
                        //若是已經存在
                        return true
                    }
                    oTempBucket = oTempBucket.next;
                }
                return false;
            }
            delete(key) {
                let hash = this.makeHash(key);
                //遊標桶
                var oTempBucket = this.bucket[hash];
                while (oTempBucket.next) {
                    // 判斷下一個的key是不是
                    if (oTempBucket.next.key == key) {
                        console.log(oTempBucket, oTempBucket.next.next)
                        //當前的這個denext等於下一個的下一個
                        oTempBucket.next = oTempBucket.next.next;
                        return true;
                    }

                    oTempBucket = oTempBucket.next;
                }
                return false;
            }
            clear() {
                this.bucket = new Array(8);
                for (var i = 0; i < this.bucket.length; i++) {
                    this.bucket[i] = {
                        type: 'bucket_' + i,
                        next: null
                    }
                }
            }
        }
複製代碼

二叉樹

  • 正在寫。。。
複製代碼

  • 正在寫。。。
複製代碼
相關文章
相關標籤/搜索