栈与队列的定义与区别
1、棧
首先,普通的線性表實現(xiàn)是有兩個端口可以訪問的,但是如果作為棧就要封閉一端,只能訪問另一端。這當然不是自討苦吃,棧是一種抽象數(shù)據(jù)結(jié)構(gòu),是對現(xiàn)實世界對象的模擬。比如,自助餐廳中的一疊盤子,新盤子放在這一疊盤子的最上面,取得時候也是從最上面取。將其抽象出來就是棧,這是最合適的抽象方式。
基于棧的操作非常簡單:
- 將數(shù)據(jù)壓入棧頂-push
- 將棧頂數(shù)據(jù)彈出-pop
- 查看棧頂數(shù)據(jù)-top
棧的實現(xiàn)不是難點,基于棧的操作也很簡單,重點是棧的運用。
動態(tài)圖:
偽代碼如下:
largeNumAdd() {讀第一個數(shù)的數(shù)字,并將這些數(shù)字壓入到一個棧中;讀第二個數(shù)的數(shù)字,并將這些數(shù)字壓入到另一個棧中;carry = 0; //代表進位while(至少有一個棧不為空)從每個非空的棧中彈出一個數(shù),將這兩個數(shù)字與進位相加;將和的個位數(shù)字壓入到結(jié)果棧中;將和的進位存到carry中;如果進位不為0,將其壓入到結(jié)果棧中;從結(jié)果棧中彈出數(shù)字并顯示; }簡單起見,這里給出456和7891相加時棧的結(jié)構(gòu):
這不就是我們學(xué)過的加法計算公式嘛,是的,這里使用棧模擬了加法過程。
將數(shù)字壓入棧中,其實維持了千位、百位、十位、個位之間的次序,正是這個原因才能保證棧彈出的時候數(shù)字相加是合理的。這只是棧簡單的一種運用,在現(xiàn)實生活中,所有需要保持次序的數(shù)據(jù),都可以使用棧這種先進后出的結(jié)構(gòu),通過巧妙的設(shè)計完成算法邏輯。
2、隊列
隊列是一種簡單的等待序列,在尾部加入元素時隊列加長,在前端刪除數(shù)據(jù)時隊列縮短。與棧不同,隊列是一種使用兩端的結(jié)構(gòu):一端用來加入新元素,另一端用來刪除元素。隊列是先進先出的結(jié)構(gòu)。
隊列的操作與棧操作相似:
- 在隊列尾部加入元素-enqueue(el)
- 取出隊列的第一個元素-dequeue()
- 查看隊列頭部元素-firstEI()
動態(tài)圖:
隊列的實現(xiàn):
隊列的一種可能實現(xiàn)方式是使用數(shù)組,但這并非最佳選擇。元素從隊尾加入而從隊首刪除,這會釋放數(shù)組中的某些單元,這些單元不應(yīng)該浪費。一種可能的做法是使用循環(huán)數(shù)組,如果隊尾已滿而隊首有空的單元,可以將新加元素放入隊首,形成循環(huán)數(shù)組,這種做法是空間比較緊張時的無奈之舉,因為它破壞了隊列的簡單易用性,所以不推薦。
隊列的另一種可能實現(xiàn)是使用雙向鏈表,那么執(zhí)行入隊列和出隊列操作僅需要常數(shù)時間,并且沒有數(shù)組實現(xiàn)中空間的浪費,因此,推薦這種方法。
棧與隊列的區(qū)別
1、隊列先進先出,棧先進后出。
2、對插入和刪除操作的"限定"不同。
棧是限定只能在表的一端進行插入和刪除操作的線性表。 ? ??
隊列是限定只能在表的一端進行插入和在另一端進行刪除操作的線性表。 ?
3、遍歷數(shù)據(jù)速度不同。
棧只能從頭部取數(shù)據(jù),也就最先放入的需要遍歷整個棧最后才能取出來,而且在遍歷數(shù)據(jù)的時候還得為數(shù)據(jù)開辟臨時空間,保持數(shù)據(jù)在遍歷前的一致性。
隊列則不同,它基于地址指針進行遍歷,而且可以從頭或尾部開始遍歷,但不能同時遍歷,無需開辟臨時空間,因為在遍歷的過程中不影像數(shù)據(jù)結(jié)構(gòu),速度要快的多
擴展資料
棧(stack)又名堆棧,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。
向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。
隊列是一種特殊的線性表,特殊之處在于它只允許在表的前端(front)進行刪除操作,而在表的后端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。隊列中沒有元素時,稱為空隊列。
隊列的數(shù)據(jù)元素又稱為隊列元素。在隊列中插入一個隊列元素稱為入隊,從隊列中刪除一個隊列元素稱為出隊。因為隊列只允許在一端插入,在另一端刪除,所以只有最早進入隊列的元素才能最先從隊列中刪除,故隊列又稱為先進先出(FIFO—first in first out)線性表。
棧(Stack)和隊列(Queue)是兩種操作受限的線性表。
(線性表:線性表是一種線性結(jié)構(gòu),它是一個含有n≥0個結(jié)點的有限序列,同一個線性表中的數(shù)據(jù)元素數(shù)據(jù)類型相同并且滿足“一對一”的邏輯關(guān)系。
“一對一”的邏輯關(guān)系指的是對于其中的結(jié)點,有且僅有一個開始結(jié)點沒有前驅(qū)但有一個后繼結(jié)點,有且僅有一個終端結(jié)點沒有后繼但有一個前驅(qū)結(jié)點,其它的結(jié)點都有且僅有一個前驅(qū)和一個后繼結(jié)點。)
這種受限表現(xiàn)在:棧的插入和刪除操作只允許在表的尾端進行(在棧中成為“棧頂”),滿足“FIFO:First In Last Out”;隊列只允許在表尾插入數(shù)據(jù)元素,在表頭刪除數(shù)據(jù)元素,滿足“First In First Out”。
棧與隊列的相同點:
1.都是線性結(jié)構(gòu)。
2.插入操作都是限定在表尾進行。
3.都可以通過順序結(jié)構(gòu)和鏈式結(jié)構(gòu)實現(xiàn)。、
4.插入與刪除的時間復(fù)雜度都是O(1),在空間復(fù)雜度上兩者也一樣。
5.多鏈棧和多鏈隊列的管理模式可以相同。
棧與隊列的不同點:
1.刪除數(shù)據(jù)元素的位置不同,棧的刪除操作在表尾進行,隊列的刪除操作在表頭進行。
2.應(yīng)用場景不同;常見棧的應(yīng)用場景包括括號問題的求解,表達式的轉(zhuǎn)換和求值,函數(shù)調(diào)用和遞歸實現(xiàn),深度優(yōu)先搜索遍歷等;常見的隊列的應(yīng)用場景包括計算機系統(tǒng)中各種資源的管理,消息緩沖器的管理和廣度優(yōu)先搜索遍歷等。
3.順序棧能夠?qū)崿F(xiàn)多棧空間共享,而順序隊列不能。
?
?
總結(jié)
以上是生活随笔為你收集整理的栈与队列的定义与区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css特效实现透明渐变
- 下一篇: Docker快速入门与使用