摘要:內存空間又被分為兩種,棧內存與堆內存。今天就堆棧隊列的內容就大概說到這里下一篇博客在繼續說一下,有什么說的不對或者不足的地方,請大家批評指正
棧的定義
棧是計算機科學中的一種抽象數據類型,只允許在有序的線性數據集合的一端(稱為堆棧頂端,英語:top)進行加入數據(英語:push)和移除數據(英語:pop)的運算。因而按照后進先出(LIFO, Last In First Out)的原理運作。(百科全書)
棧的常用操作棧中有兩個基本的操作
推入 :從棧的頂端推入一個數據,依次往下推
彈出 :講棧頂端的數據移除
棧的基本提點就是
先進后出,后進先出
除了頭尾的節點,每個元素都有一個先驅和一個后繼
對于棧的畫面的理解,可以想象成一個步槍彈夾添加子彈和射擊的過程
彈夾只有一個出入口進行推入和彈出
效果圖如下
棧被創建的時機上邊說了棧的基本結構和方法,那么棧被創建的時候又做了什么事情呢
首先在我們的js在解釋執行代碼的時候,最先遇到的就是全局代碼,所以在一開始的時候首先就會向棧里邊壓入一個全局執行上下文
全局上下文 只有在全局執行環境被銷毀的時候才會被彈出銷毀
全局執行上下文 只有一個 就是瀏覽器中的window對象,this默認指向這個全局對象
然后當執行一個函數的時候,會在開始先創建一個執行上下文壓入棧中,如果里邊又執行其他的函數的時候,又會創建一個新的執行上下文壓入執行棧中,直到函數執行完畢,就會把函數的上下文從執行棧中彈出
function fun3() { console.log("3") } function fun2() { fun3(); } function fun1() { fun2(); } fun1();
比如說上邊這段代碼 ,他的進棧出棧順序就是一開始我們放的那兩張圖的效果
function fun1() { console.log("1") } function fun2() { console.log("2") } function fun3() { console.log("3") }
如果是這種的話 則會是最下邊有一個全局的棧,然后三個函數分別進棧出棧
棧中的執行上下文剛才我們在上邊提到了執行上下文的概念,執行上下文是跟函數相關的,執行上下文分為兩個階段
創建階段
執行階段
首先創建階段
掃描變量和函數(確定變量環境)
確定this指向
確定詞法環境
簡單說一下詞法環境和變量環境的區別,我個人理解的就是說詞法環境是包含變量環境的
在js里邊原型鏈大家都不陌生 ,js在當前的對象里邊找不到所使用的屬性的話會去他的上一級去找
直到Object,再找不到就會undefined ,這里邊 當前對象的作用域就是他的變量環境,而詞法環境則是與之關聯的的執行上下文中聲明的變量
在創建階段 函數的聲明會被儲存在當前的變量環境之中,var的變量的話則會被設置成undefined
,所以我們在聲明之前就可以訪問到var聲明的變量 ,but他是一個undfined
然后就是執行階段了
這個時候已經完成了對所有變量的分配,開始執行代碼
隊列的定義隊列是一種比較高效的數據結構,他與棧不同的是,隊列只能在隊尾插入元素,在隊首刪除元素,
隊列用生活中的事物距離的話,大家可以想想一下沙漏,先進入的沙子先出去,后進去的沙子后出去
隊列比棧高效的地方就在于,循環的時候,棧會開辟一個新的臨時棧,然后進行排序,再循環,最后在確保不打亂原有順序的情況下 排列回去
隊列則不需要這么多步驟
js模擬隊列實現隊列常用的一些操作有
向隊尾添加一個元素
刪除隊首元素
顯示所有元素
清空隊列
隊列是否為空
就先拿這些常用的方法實現以下,老規矩,請大家看代碼
// 隊列類 class Queue { constructor() { this.dataStore = [] } //新增 addQueue(val) { this.dataStore.push(val); } //刪除隊列首的元素 delQueue() { return this.queueIsNone()?console.log("隊列空了"):this.dataStore.shift() } //隊列是否為空 queueIsNone() { return this.dataStore.length == 0 } //查看所有元素 showQueue() { return this.dataStore.join(" "); } //清空隊列 clearQueue() { this.dataStor = []; this.showQueue() console.log("隊列空了") } } // 隊列實例 let queueOne = new Queue() /** * @author: 周靖松 * @information: 進隊 * @Date: 2019-06-11 21:01:28 */ function QueueIn (){ queueOne.addQueue(funStackBox.value) console.log(queueOne.showQueue()) } /** * @author: 周靖松 * @information: 出隊 * @Date: 2019-06-11 21:01:35 */ function QueueOut (){ queueOne.delQueue() console.log(queueOne.showQueue()) } /** * @author: 周靖松 * @information: 清空隊列 * @Date: 2019-06-11 21:05:35 */ function QueueClear(){ queueOne.clearQueue() }
上邊的代碼 大家可以自己寫個html試一下哈,html就不寫了直接貼一下效果圖
另外雖然剛才我們再例子中是用數據去模擬的棧和隊列的實現,but 數組他其實并不是一個棧內存,他是一個堆內存
堆的定義若是滿足以下特性,即可稱為堆:是計算機科學中的一種特別的樹狀數據結構。可以給堆中的任意節點添加新的節點(百科全書)
堆和棧的區別在JS中,每一個數據都需要一個內存空間。內存空間又被分為兩種,棧內存(stack)與堆內存(heap)。
棧為自動分配的內存空間,它由系統自動釋放
堆是動態分配的內存,大小不定也不會自動釋放
也不是說不會自動釋放,堆在沒有引用的時候,下一次垃圾回收機制出現的時候會回收他的內存
js 的變量分為基本類型和引用類型
基本類型 (Undefined、Null、Boolean、Number和String)
基本類型在內存中占據空間小、大小固定 ,他們的值保存在棧(stack)空間,是按值來訪問
引用類型 (對象、數組、函數)
引用類型占據空間大、大小不固定, 棧內存中存放地址指向堆(heap)內存中的對象。是按引用訪問的
盜個圖舉個例子
js不允許直接訪問堆內存中的位置,因此我們不能直接操作對象的堆內存空間,所以棧中存的是一個指向堆內存的一個地址
當我們要訪問堆內存中的引用數據類型時,實際上我們首先是從棧中獲取了該對象的地址引用(或者地址指針),然后再從堆內存中取得我們需要的數據。
今天就堆棧隊列的內容就大概說到這里 下一篇博客 在繼續說一下, 有什么說的不對或者不足的地方,請大家批評指正
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105532.html
摘要:棧和隊列是開發中最常用的兩種數據結構。如果又有數據入棧,的值將增加到。如果一個數據從棧中被取出,的值將會減少為。隊列與棧類似,隊列也是一個線性數據結構。與棧不同的是,隊列只刪除最先添加的數據。現在,讓我們將棧大小的實現應用到隊列中。 翻譯:瘋狂的技術宅英文:https://code.tutsplus.com/art...說明:本文翻譯自系列文章《Data Structures With...
摘要:于是翻出了機房里的這本學習數據結構與算法開始學習程序員的基礎知識。這本書用了我最熟悉的來實現各種數據結構和算法,而且書很薄,可以說是一本不錯的入門教程。隊列在頭部刪除元素,尾部添加元素。 本系列所有文章:第一篇文章:學習數據結構與算法之棧與隊列第二篇文章:學習數據結構與算法之鏈表第三篇文章:學習數據結構與算法之集合第四篇文章:學習數據結構與算法之字典和散列表第五篇文章:學習數據結構與算...
摘要:對于棧和堆的理解棧棧是有結構的,存儲的時候按順序存儲,先存進去的在棧的最下面,遵循先進后出的原則,棧中存放的是基本數據類型變量的值,以及引用數據類型中指向堆的引用地址,占據的空間大小一般是確定的。 對于棧和堆的理解 棧(stack) 棧是有結構的,存儲的時候按順序存儲,先存進去的在棧的最下面,遵循’先進后出‘的原則,棧中存放的是基本數據類型變量的值,以及引用數據類型中指向堆的引用(地址...
摘要:之數組操作接下來就是數據結構的第一部分,棧。以字符串顯示棧中所有內容方法的實現說明需要往棧中添加新元素,元素位置在隊列的末尾。的前端樂園原文鏈接寒假前端學習學習數據結構與算法,棧與隊列 本系列的第一篇文章: 學習JavaScript數據結構與算法(一),棧與隊列第二篇文章:學習JavaScript數據結構與算法(二):鏈表第三篇文章:學習JavaScript數據結構與算法(三):集合第...
摘要:事件循環背景是一門單線程非阻塞的腳本語言,單線程意味著,代碼在執行的任何時候,都只有一個主線程來處理所有的任務。在意識到該問題之際,新特性中的可以讓成為一門多線程語言,但實際開發中使用存在著諸多限制。這個地方被稱為執行棧。 事件循環(Event Loop) 背景 JavaScript是一門單線程非阻塞的腳本語言,單線程意味著,JavaScript代碼在執行的任何時候,都只有一個主線程來...
閱讀 1158·2023-04-26 01:35
閱讀 2513·2021-11-02 14:44
閱讀 7642·2021-09-22 15:38
閱讀 2205·2021-09-06 15:11
閱讀 3720·2019-08-30 15:53
閱讀 795·2019-08-29 16:54
閱讀 631·2019-08-26 13:48
閱讀 1763·2019-08-26 13:47