99久久精品国产片-99久久精品国产免费-99久久精品国产麻豆-99久久精品国产国产毛片-99久久精品国产高清一区二区-99久久精品费精品国产一区二区

JavaScript版數據結構與算法——基礎篇(一)

2020-5-28    前端達人

數組

數組——最簡單的內存數據結構

數組存儲一系列同一種數據類型的值。( Javascript 中不存在這種限制)

對數據的隨機訪問,數組是更好的選擇,否則幾乎可以完全用 「鏈表」 來代替

在很多編程語言中,數組的長度是固定的,當數組被填滿時,再要加入新元素就很困難。Javascript 中數組不存在這個問題。

但是 Javascript 中的數組被實現成了對象,與其他語言相比,效率低下。

數組的一些核心方法

方法 描述
push 方法將一個或多個元素添加到數組的末尾,并返回該數組的新長度。(改變原數組)
pop 方法從數組中刪除最后一個元素,并返回該元素的值。(改變原數組)
shift 方法從數組中刪除第一個元素,并返回該元素的值,如果數組為空則返回 undefined 。(改變原數組)
unshift 將一個或多個元素添加到數組的開頭,并返回該數組的新長度(改變原數組)
concat 連接兩個或多個數組,并返回結果(返回一個新數組,不影響原有的數組。)
every 對數組中的每個元素運行給定函數,如果該函數對每個元素都返回 true,則返回 true。若為一個空數組,,始終返回 true。 (不會改變原數組,[].every(callback)始終返回 true)
some 對數組中的每個元素運行給定函數,如果任一元素返回 true,則返回 true。若為一個空數組,,始終返回 false。(不會改變原數組,)
forEach 對數組中的每個元素運行給定函數。這個方法沒有返回值,沒有辦法中止或者跳出 forEach() 循環,除了拋出一個異常(foreach不直接改變原數組,但原數組可能會被 callback 函數該改變。)
map 對數組中的每個元素運行給定函數,返回每次函數調用的結果組成的數組(map不直接改變原數組,但原數組可能會被 callback 函數該改變。)
sort 按照Unicode位點對數組排序,支持傳入指定排序方法的函數作為參數(改變原數組)
reverse 方法將數組中元素的位置顛倒,并返回該數組(改變原數組)
join 將所有的數組元素連接成一個字符串
indexOf 返回第一個與給定參數相等的數組元素的索引,沒有找到則返回 -1
lastIndexOf 返回在數組中搜索到的與給定參數相等的元素的索引里最大的值,沒有找到則返回 -1
slice 傳入索引值,將數組里對應索引范圍內的元素(淺復制原數組中的元素)作為新數組返回(原始數組不會被改變)
splice 刪除或替換現有元素或者原地添加新的元素來修改數組,并以數組形式返回被修改的內容(改變原數組)
toString 將數組作為字符串返回
valueOf 和 toString 類似,將數組作為字符串返回

是一種遵循后進先出(LIFO)原則的有序集合,新添加或待刪除的元素都保存在棧的同一端,稱作棧頂,另一端就叫棧底。在棧里,新元素都靠近棧頂,舊元素都接近棧底。

通俗來講,就是你向一個桶里放書本或者盤子,你要想取出最下面的書或者盤子,你必須要先把上面的都先取出來。

棧也被用在編程語言的編譯器和內存中保存變量、方法調用等,也被用于瀏覽器歷史記錄 (瀏覽器的返回按鈕)。

代碼實現

// 封裝棧
    function Stack() {
        // 棧的屬性
        this.items = []

        // 棧的操作
        // 1.將元素壓入棧
        Stack.prototype.push = function (element) {
            this.items.push(element)
        }
        // 2.從棧中取出元素
        Stack.prototype.pop = function () {
            return this.items.pop()
        }
        // 3.查看棧頂元素
        Stack.prototype.peek = function () {
            return this.items[this.items.length - 1]
        }
        // 4.判斷是否為空
        Stack.prototype.isEmpty = function () {
            return this.items.length === 0
        }
        // 5.獲取棧中元素的個數
        Stack.prototype.size = function () {
            return this.items.length
        }
        // 6.toString()方法
        Stack.prototype.toString = function () {
            let str = ''
            for (let i = 0; i< this.items.length; i++) {
                str += this.items[i] + ' '
            }
            return str
        }

    }

    // 棧的使用
    let s = new Stack()

隊列

隊列是遵循先進先出(FIFO,也稱為先來先服務)原則的一組有序的項。隊列在尾部添加新
元素,并從頂部移除元素。添加的元素必須排在隊列的末尾。

生活中常見的就是排隊

代碼實現

function Queue() {
        this.items = []
        // 1.將元素加入隊列
        Queue.prototype.enqueue = function (element) {
            this.items.push(element)
        }
        // 2.從隊列前端刪除元素
        Queue.prototype.dequeue = function () {
            return this.items.shift()
        }
        // 3.查看隊列前端元素
        Queue.prototype.front = function () {
            return this.items[0]
        }
        // 4.判斷是否為空
        Queue.prototype.isEmpty = function () {
            return this.items.length === 0
        }
        // 5.獲取隊列中元素的個數
        Queue.prototype.size = function () {
            return this.items.length
        }
        // 6.toString()方法
        Queue.prototype.toString = function () {
            let str = ''
            for (let i = 0; i< this.items.length; i++) {
                str += this.items[i] + ' '
            }
            return str
        }
    }
    
    // 隊列使用
    let Q = new Queue()

優先級隊列:

代碼實現


function PriorityQueue() {
        function QueueElement(element, priority) {
            this.element = element
            this.priority = priority
        }
        this.items = []

        PriorityQueue.prototype.enqueue = function (element, priority) {
            let queueElement = new QueueElement(element,priority)

            // 判斷隊列是否為空
            if (this.isEmpty()) {
                this.items.push(queueElement)
            } else {
                let added = false // 如果在隊列已有的元素中找到滿足條件的,則設為true,否則為false,直接插入隊列尾部
                for (let i = 0; i< this.items.length; i++) {
                    // 假設priority值越小,優先級越高,排序越靠前
                    if (queueElement.priority < this.items[i].priority) {
                        this.items.splice(i, 0, queueElement)
                        added = true
                        break
                    }
                }
                if (!added) {
                    this.items.push(queueElement)
                }
            }

        }
        
    }
    

鏈表

鏈表——存儲有序的元素集合,但在內存中不是連續放置的。


鏈表(單向鏈表)中的元素由存放元素本身「data」 的節點和一個指向下一個「next」 元素的指針組成。牢記這個特點

相比數組,鏈表添加或者移除元素不需要移動其他元素,但是需要使用指針。訪問元素每次都需要從表頭開始查找。

代碼實現:
單向鏈表


function LinkedList() {
        function Node(data) {
            this.data = data
            this.next = null

        }
        this.head = null // 表頭
        this.length = 0
        // 插入鏈表
        LinkedList.prototype.append = function (data) {
            // 判斷是否是添加的第一個節點
            let newNode = new Node(data)
            if (this.length == 0) {
                this.head = newNode
            } else {
                let current = this.head
                while (current.next) { 
                // 如果next存在,
                // 則當前節點不是鏈表最后一個
                // 所以繼續向后查找
                    current = current.next
                }
                // 如果next不存在
                 // 則當前節點是鏈表最后一個
                // 所以讓next指向新節點即可
                current.next = newNode
            }
            this.length++
        }
        // toString方法
        LinkedList.prototype.toString = function () {
            let current = this.head
            let listString = ''
            while (current) {
                listString += current.data + ' '
                current = current.next
            }
            return listString
        }
         // insert 方法
        LinkedList.prototype.insert = function (position, data) {
            if (position < 0 || position > this.length) return false
            let newNode = new Node(data)
            if (position == 0) {
                newNode.next = this.head
                this.head = newNode
            } else {
                let index = 0
                let current = this.head
                let prev = null
                while (index++ < position) {
                    prev = current
                    current = current.next
                }
                newNode.next = current
                prev.next = newNode
            }
            this.length++
            return true
        }
        // get方法
        LinkedList.prototype.get = function (position) {
            if (position < 0 || position >= this.length) return null
            let index = 0
            let current = this.head
            while (index++ < position){
                current = current.next
            }
            return current.data
        }
        LinkedList.prototype.indexOf = function (data) {
            let index = 0
            let current = this.head
            while (current) {
                if (current.data == data) {
                    return index
                } else {
                    current = current.next
                    index++
                }
            }

            return  -1
        }
        LinkedList.prototype.update = function (position, data) {
            if (position < 0 || position >= this.length) return false
            let index = 0
            let current = this.head
            while (index++ < position) {
                current = current.next
            }
            current.data = data
            return  true
        }
        LinkedList.prototype.removeAt = function (position) {
            if (position < 0 || position >= this.length) return null
            if (position == 0) {
                this.head = this.head.next
            } else {
                let index = 0
                let current = this.head
                let prev = null
                while (index++ < position) {
                    prev = current
                    current = current.next
                }
                prev.next = current.next
            }
            this.length--
            return  true


        }
        LinkedList.prototype.remove = function (data) {
            let postions = this.indexOf(data)

            return this.removeAt(postions)
        }
        
    }

    let list = new LinkedList()
雙向鏈表:包含表頭表尾 和 存儲數據的 節點,其中節點包含三部分:一個鏈向下一個元素的next, 另一個鏈向前一個元素的prev 和存儲數據的 data牢記這個特點

function doublyLinkedList() {
        this.head = null // 表頭:始終指向第一個節點,默認為 null
        this.tail = null // 表尾:始終指向最后一個節點,默認為 null
        this.length = 0 // 鏈表長度

        function Node(data) {
            this.data = data
            this.prev = null
            this.next = null
        }

        doublyLinkedList.prototype.append = function (data) {
            let newNode = new Node(data)

            if (this.length === 0) {
            // 當插入的節點為鏈表的第一個節點時
            // 表頭和表尾都指向這個節點
                this.head = newNode
                this.tail = newNode
            } else {
            // 當鏈表中已經有節點存在時
            // 注意tail指向的始終是最后一個節點
            // 注意head指向的始終是第一個節點
            // 因為是雙向鏈表,可以從頭部插入新節點,也可以從尾部插入
            // 這里以從尾部插入為例,將新節點插入到鏈表最后
            // 首先將新節點的 prev 指向上一個節點,即之前tail指向的位置
                newNode.prev = this.tail
            // 然后前一個節點的next(及之前tail指向的節點)指向新的節點
            // 此時新的節點變成了鏈表的最后一個節點
                this.tail.next = newNode
            // 因為 tail 始終指向的是最后一個節點,所以最后修改tail的指向
                this.tail = newNode
            }
            this.length++
        }
        doublyLinkedList.prototype.toString = function () {
            return this.backwardString()
        }
        doublyLinkedList.prototype.forwardString = function () {
            let current = this.tail
            let str = ''

            while (current) {
                str += current.data + ''
                current = current.prev
            }

            return str
        }
        doublyLinkedList.prototype.backwardString = function () {
            let current = this.head
            let str = ''

            while (current) {
                str += current.data + ''
                current = current.next
            }

            return str
        }

        doublyLinkedList.prototype.insert = function (position, data) {
            if (position < 0 || position > this.length) return false
            let newNode = new Node(data)
            if (this.length === 0) {
                this.head = newNode
                this.tail = newNode
            } else {
                if (position == 0) {
                    this.head.prev = newNode
                    newNode.next = this.head
                    this.head = newNode
                } else if (position == this.length) {
                    newNode.prev = this.tail
                    this.tail.next = newNode
                    this.tail = newNode
                } else {
                    let current = this.head
                    let index = 0
                    while( index++ < position){
                        current = current.next
                    }
                    newNode.next = current
                    newNode.prev = current.prev
                    current.prev.next = newNode
                    current.prev = newNode

                }

            }

            this.length++
            return true
        }
        doublyLinkedList.prototype.get = function (position) {
            if (position < 0 || position >= this.length) return null
            let current = this.head
            let index = 0
            while (index++) {
                current = current.next
            }

            return current.data
        }
        doublyLinkedList.prototype.indexOf = function (data) {
            let current = this.head
            let index = 0
            while (current) {
                if (current.data === data) {
                    return index
                }
                current = current.next
                index++
            }
            return  -1
        }
        doublyLinkedList.prototype.update = function (position, newData) {
            if (position < 0 || position >= this.length) return false
            let current = this.head
            let index = 0
            while(index++ < position){
                current = current.next
            }
            current.data = newData
            return true
        }
        doublyLinkedList.prototype.removeAt = function (position) {
            if (position < 0 || position >= this.length) return null
            let current = this.head
            if (this.length === 1) {
                this.head = null
                this.tail = null
            } else {
                if (position === 0) { // 刪除第一個節點
                    this.head.next.prev = null
                    this.head = this.head.next
                } else if (position === this.length - 1) { // 刪除最后一個節點
                    this.tail.prev.next = null
                    this.tail = this.tail.prev
                } else {
                    let index = 0
                    while (index++ < position) {
                        current = current.next
                    }
                    current.prev.next = current.next
                    current.next.prev = current.prev
                }
            }
            this.length--
            return current.data
        }
        doublyLinkedList.prototype.remove = function (data) {
            let index = this.indexOf(data)
            return this.removeAt(index)
        }
    }


感謝你的閱讀~
————————————————
版權聲明:本文為CSDN博主「重慶崽兒Brand」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/brand2014/java/article/details/106134844



日歷

鏈接

個人資料

藍藍設計的小編 http://www.lapeinture.cn

存檔

美女免费精品视频在线观看| 免费一级生活片| 99热视热频这里只有精品| 九九精品影院| 日本伦理网站| 国产成人精品综合在线| 精品国产一区二区三区免费| 韩国毛片免费| 国产视频一区二区在线播放| 国产成人啪精品| 久草免费在线视频| 日韩在线观看网站| 国产一区二区高清视频| 日韩一级精品视频在线观看| 国产视频一区二区三区四区| 国产成人啪精品视频免费软件| 亚洲第一页乱| 精品久久久久久中文字幕2017| 国产精品自拍在线观看| 91麻豆精品国产自产在线观看一区 | 91麻豆精品国产自产在线 | 久久精品大片| 国产91精品一区| 国产网站在线| 欧美爱色| 欧美另类videosbestsex视频| 国产亚洲精品aaa大片| 欧美1卡一卡二卡三新区| 国产精品1024永久免费视频| 久久成人性色生活片| 久草免费在线视频| 午夜激情视频在线观看| 九九精品影院| 天天做日日爱| 九九九在线视频| 日韩中文字幕在线观看视频| 欧美a免费| 天天做人人爱夜夜爽2020| 国产麻豆精品| 国产不卡精品一区二区三区| 免费国产在线视频| 国产美女在线观看| 欧美日本免费| 成人免费观看的视频黄页| 午夜在线亚洲| 青草国产在线观看| 日本乱中文字幕系列| 91麻豆国产| 精品美女| 精品美女| 免费国产在线视频| 免费国产在线观看不卡| 成人高清免费| 日本特黄特色aa大片免费| 国产精品自拍亚洲| 色综合久久天天综合绕观看| 美国一区二区三区| 精品国产一区二区三区久久久蜜臀| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产麻豆精品hdvideoss| 精品视频在线看 | 成人免费观看网欧美片| 色综合久久天天综合观看| 欧美日本韩国| 四虎久久影院| 韩国毛片免费| 成人a级高清视频在线观看| 色综合久久天天综线观看| 日本乱中文字幕系列| 日本乱中文字幕系列| 91麻豆精品国产高清在线| 九九九在线视频| 久久久久久久男人的天堂| 精品视频在线观看免费| 欧美激情一区二区三区在线| 国产成人精品综合在线| 一级女性大黄生活片免费| 亚洲精品中文一区不卡 | 四虎影视久久久| 韩国毛片 免费| 欧美激情一区二区三区在线播放| 日韩在线观看视频免费| 99久久精品国产片| 精品视频在线观看一区二区| 成人免费福利片在线观看| 久久久久久久男人的天堂| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产欧美精品| 国产91精品一区| 成人a大片在线观看| 你懂的日韩| 成人免费一级纶理片| 91麻豆精品国产高清在线| 黄色福利片| 午夜在线亚洲男人午在线| 国产一区精品| 欧美激情一区二区三区视频高清| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 精品视频一区二区三区免费| 99久久精品费精品国产一区二区| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 欧美激情中文字幕一区二区| 精品国产一区二区三区久久久狼 | 亚洲 欧美 成人日韩| 久久国产一区二区| 精品久久久久久免费影院| 久久精品免视看国产明星| 你懂的日韩| 国产a免费观看| 欧美激情中文字幕一区二区| 久久精品大片| 青青青草视频在线观看| 欧美激情一区二区三区在线| 久久国产一区二区| 国产欧美精品| 成人免费福利片在线观看| 日韩中文字幕一区| 天天色成人| 你懂的日韩| 日韩一级黄色| 国产精品自拍一区| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产亚洲精品aaa大片| 欧美激情一区二区三区在线| 二级特黄绝大片免费视频大片| 日韩中文字幕在线播放| 精品国产一区二区三区久久久狼 | 国产a免费观看| 亚洲www美色| 亚久久伊人精品青青草原2020| 人人干人人草| 国产美女在线一区二区三区| 日本伦理网站| 99久久网站| 精品国产一区二区三区国产馆| 二级特黄绝大片免费视频大片| 国产激情一区二区三区| 国产不卡高清在线观看视频| 日韩专区一区| 国产美女在线一区二区三区| 精品久久久久久中文字幕2017| 九九久久国产精品| 国产精品1024永久免费视频| 国产激情视频在线观看| 成人在免费观看视频国产| 国产一区二区高清视频| 亚洲第一色在线| 欧美大片a一级毛片视频| 日韩专区一区| 可以在线看黄的网站| 日韩专区亚洲综合久久| 国产91丝袜高跟系列| 日本免费乱人伦在线观看 | 色综合久久手机在线| 99热精品在线| 欧美激情一区二区三区视频高清| 一本高清在线| 中文字幕Aⅴ资源网| 日本乱中文字幕系列| 九九久久国产精品| 日本免费看视频| 亚洲 国产精品 日韩| 日韩中文字幕一区| 精品国产一区二区三区久久久蜜臀| 午夜久久网| 亚洲女人国产香蕉久久精品| 国产伦精品一区二区三区在线观看 | 亚欧成人毛片一区二区三区四区| 成人高清免费| 国产高清在线精品一区a| 美女免费精品视频在线观看| 日日爽天天| 精品国产香蕉在线播出| 日本免费乱人伦在线观看 | 999精品影视在线观看| 亚洲 激情| 精品视频免费看| 九九久久国产精品大片| 久久国产精品永久免费网站| 精品久久久久久中文字幕一区| 99热视热频这里只有精品| 九九久久国产精品| 久久国产精品自线拍免费| 欧美国产日韩在线| 精品视频免费看| 欧美激情影院| 日日夜夜婷婷| 亚洲www美色| 欧美激情中文字幕一区二区| 精品国产三级a| 成人免费观看网欧美片| 欧美激情一区二区三区在线播放| 可以在线看黄的网站| 欧美爱色| 欧美爱色| 久久国产一久久高清| 国产不卡在线观看视频| 欧美一级视频免费| 99久久精品国产麻豆| 一级女性全黄生活片免费|