程序员基本功10栈和队列
1、棧的基本概念
棧是一種數(shù)據(jù)結(jié)構(gòu),它代表只能在某一段進(jìn)行插入、刪除操作的特殊線性表,通常就是在線性表的末端進(jìn)行插入、刪除操作。
歸納起來(lái)就是:棧就是一種后進(jìn)先出的線性表
2、棧提供的基本方法
棧不允許提供從中間任意位置訪問(wèn)元素的方法,棧只允許在棧頂插入、刪除元素
初始化:通常是一個(gè)構(gòu)造器,用于創(chuàng)建一個(gè)空棧
返回棧的長(zhǎng)度、入棧、出棧、訪問(wèn)棧頂元素、判斷棧是否為空、清空棧
3、順序棧的實(shí)現(xiàn)和方法實(shí)現(xiàn)
順序棧利用一組地址連續(xù)的存儲(chǔ)單元依次存放從棧底到棧頂?shù)臄?shù)據(jù)元素。棧底位置固定不變,它的頂棧元素可以直接通過(guò)棧底層數(shù)組的元素訪問(wèn)ar[size-1]。
進(jìn)棧:只需將新的數(shù)據(jù)元素存入棧內(nèi),然后再記錄棧內(nèi)元素個(gè)數(shù)的變量+1,程序即可再次通過(guò)arr【size-1】重新訪問(wèn)新的棧頂元素。
出棧:讓記錄棧內(nèi)元素個(gè)數(shù)的變量減1;釋放數(shù)組對(duì)棧頂元素的引用。
4、鏈?zhǔn)綏5膶?shí)現(xiàn)和方法實(shí)現(xiàn)
棧頂元素不斷改變,程序只要使用一個(gè)top引用來(lái)記錄當(dāng)前的棧頂元素,top引用變量永遠(yuǎn)引用棧頂元素,再使用一個(gè)size變量記錄當(dāng)前棧中包含多少元素即可。
進(jìn)棧:讓top引用指向新添加的元素,新元素的next引用指向原來(lái)的棧頂元素。讓記錄棧內(nèi)元素個(gè)數(shù)size變量+1.
出棧:讓top引用指向原棧頂元素的下一個(gè)元素,并釋放原來(lái)的棧頂元素。
5、Java集合框架提供的棧
java.utill.Stack:它就是一個(gè)普通的順序棧,底層基于數(shù)組實(shí)現(xiàn),線性安全,在多線程環(huán)境下可安心使用
java.util.LinkedList:LinkedList是一個(gè)雙向鏈表,但它提供了push(),pop(),peek()等方法,這表明LInkedList可以但成棧來(lái)使用。但是線性不安全,如果在多線程環(huán)境下使用,應(yīng)該使用Collections類將其改造成線性安全。
6、隊(duì)列的基本概念
隊(duì)列是一種被限制的線性表,它使用固定的一段來(lái)插入數(shù)據(jù),另一端來(lái)刪除數(shù)據(jù),也就是說(shuō),隊(duì)列中元素的移動(dòng)方向是固定的。
隊(duì)列是一種特殊的線性表,它只允許在表的前端進(jìn)行刪除操作,在表的后端進(jìn)行插入操作,進(jìn)行插入的端稱為隊(duì)尾,進(jìn)行刪除的端稱為對(duì)頭。
7、隊(duì)列提供的基本方法
初始化:通常是一個(gè)構(gòu)造器,用于創(chuàng)建一個(gè)空隊(duì)列
返回隊(duì)列的長(zhǎng)隊(duì):返回隊(duì)列中數(shù)組元素的長(zhǎng)度
加入元素:向隊(duì)列的rear端插入一個(gè)數(shù)據(jù)元素,隊(duì)列長(zhǎng)度+1
刪除元素:從隊(duì)列的front端刪除一個(gè)數(shù)據(jù)元素,隊(duì)列長(zhǎng)度-1,返回被刪除的元素
訪問(wèn)隊(duì)列的前端元素:
判斷隊(duì)列的前端元素是否為空
清空隊(duì)列
8、順序隊(duì)列的實(shí)現(xiàn)和方法實(shí)現(xiàn)
系統(tǒng)采用一組地址連續(xù)的存儲(chǔ)單元存放隊(duì)列從rear到front端的所有數(shù)據(jù)元素,程序只需front和rear倆個(gè)整形變量來(lái)記錄front端的元素索引、rear端的元素索引。對(duì)于順序隊(duì)列而言,隊(duì)列底層將采用數(shù)組來(lái)保存隊(duì)列元素,每個(gè)隊(duì)列元素在數(shù)組中的位置是固定不變的,變的只是rear和front整形變量。當(dāng)r元素進(jìn)入隊(duì)列時(shí),rear值+1,當(dāng)有元素從隊(duì)列中移除時(shí),front變量+1.
對(duì)于鏈棧而言,棧內(nèi)包含幾個(gè)元素,底層鏈?zhǔn)浇Y(jié)構(gòu)只需保存幾個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)需要添加一個(gè)next引用,這會(huì)引起部分空間的浪費(fèi)。對(duì)于順序棧來(lái)說(shuō),程序開(kāi)始就需要開(kāi)辟一塊連續(xù)的內(nèi)存。從空間利用率來(lái)看,鏈棧的空間利用率比順序棧的空間利用率更高一些。
9、循環(huán)隊(duì)列
為了重新利用順序隊(duì)列底層數(shù)組中已刪除元素所占用的空間,消除可能出現(xiàn)的“假滿”現(xiàn)象,可將順序隊(duì)列改為循環(huán)隊(duì)列,循環(huán)隊(duì)列是首位相連的隊(duì)列;當(dāng)front、rear變量達(dá)到底層數(shù)組的capacity-1之后,再前進(jìn)一位自動(dòng)變成0.
對(duì)于front==rear這種情況,如果底層數(shù)組為null,表明隊(duì)列為空,否則為滿。
10、鏈?zhǔn)疥?duì)列的實(shí)現(xiàn)和方法實(shí)現(xiàn)
采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的隊(duì)列也被稱為鏈隊(duì)列,對(duì)于鏈隊(duì)列而言,由于程序需要從rear端添加元素,從front端移除元素,因此考慮對(duì)鏈隊(duì)列增加front、rear倆個(gè)引用變量,使它們分別指向鏈隊(duì)的頭、尾倆個(gè)節(jié)點(diǎn)
11、Java集合框架提供的隊(duì)列
Java提供的Queue接口代表一個(gè)隊(duì)列。其包含6個(gè)方法用于隊(duì)列的插入移除和訪問(wèn)
?
12、雙向隊(duì)列(deque)
兩端同時(shí)進(jìn)行插入和刪除操作。?
總結(jié)
以上是生活随笔為你收集整理的程序员基本功10栈和队列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 程序员基本功09 线性表
- 下一篇: 程序员基本功08异常捕捉的陷阱