日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

栈和队列(一级)

發布時間:2024/4/13 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 栈和队列(一级) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

棧和隊列我們一般是放在一起來講的,先講棧,再講隊列,他們有什么共同點,棧和隊列他們都是線性表,都是線性結構,但是他們是操作受限制的線性表,比如我們舉個列子來說,在我們的線性表里面,我們以單鏈表為例,我們可以把其中的任何一個刪除,可以刪除第一個,也可以刪除中間的一個,也可以刪除最后的一個,添加的時候也是,你可以添加到任何兩個元素中間,你也可以加到最后,當然你也可以加到最前端,添加設刪除操作位置受限嗎,不受限,可以向任何位置添加和刪除節點,但是我們的棧和隊列就不是了,棧是怎么回事?棧Stack這對我們來說并不陌生,每次我們畫創建內存分配圖的時候,手動畫一個棧內存,就是他的,棧又叫堆棧,這個堆不要理解成棧內存和堆內存中的堆,他們是沒有關系的,棧Stack又叫堆棧,它是運算受限的線性表,首先它是線性表,但是它是運算受限的,怎么受限啦,只能在表的一端插入和刪除操作,只能在一端,比如只能在頭部做添加和刪除操作,或在尾部做添加和刪除操作,只能在一端進行,不允許在其它位置坐插入和刪除操作,查找也只能得到一端頂端的,那我們講插入刪除一端,我們就有一個棧頂,另外一端就叫做棧底,一個叫棧頂,一個叫棧底,如果一個元素也沒有我們就稱之為空棧,對棧來說我們主要是做三個操作,實際上最主要的是兩個,一個叫入棧,什么叫入棧啊,就是做一個添加操作,什么叫出棧,出棧什么意思,就是做一個刪除操作,還有一個就是獲取棧頂元素,我要看看最上面的元素到底是幾,但是那個不刪除,相當于查詢,他這里面我們看這個圖吧,剛開始這個棧呢還是一個邏輯結構,我們知道可以使用數組來實現,也可以使用鏈表來實現,你看這個圖是不是一個數組,只不過這個數組我們怎么放啊,我們向下放,我們不是左右放了,剛開始一個元素也沒有,是空的啊,剛開始是一個空棧,這就是一個數組,是不是一個元素也沒有,那最下面的這塊既是棧底也是棧頂,因為它一個元素也沒有,然后A入棧,棧頂就網上入了一個,棧底永遠不變,我可以再加個B,再加個C,再加個D,你看棧頂元素哦,棧頂是不是一直在發生變化,我把A,B,C加進來,我能不能把D加到C的下面去,在棧里面是不允許的,如果你想這么做也可以,你先把C拿出來,C的上面只能放D,我想把D放到C的下面,那你必須先把C拿出來,多兩個操作才可以,這三個操作叫什么,A入棧,出棧就需要從最上面的開始拿,先拿D,才能拿C,不拿C你就不要打算拿D,棧頂一直在發生變化,棧底是一直沒有變的,這就是我們所說的一個棧,這么做有什么意義嗎,當然有意義 我們先看生活中的案例,書怎么摞,是不是一本一本網上摞,拿的時候先拿最上面的,最上面有不要抽中間的,有人說這不合理啊,我就想抽中間的,那他就不是棧,那他就是線性表,給我把中間的一本書給抽走了,是不是相當于做了一個刪除操作啊,而把中間一本書刪除了,如果你允許這種操作的話那他就不是棧了,他就成了線性表了包括這個冰糖葫蘆,它是棧還是線性表呢,看你怎么吃了,做這個冰糖葫蘆的時候基本上都是棧的,一個一個插進去的,吃的時候不一定嗎怎么吃,先吃中間的那個,一般我們先吃上面的,按照相反的順序來吃,如果你考慮這一點的話,他就是一個棧,這是一個酒杯塔,我們在某個宴會的時候都會看到這個,一般我們看到這個酒杯塔的時候,一般會看到一個場景,什么場景啊,一個人一不小心把下面的碰倒了,結果整個酒杯塔就整個塌掉了,這是一個,有人說這怎么是棧,好好的想一下,這不是一個簡單的是或者不是能夠說明白的,那就太簡單了,大家首先想,他一共分幾層,一共分4層,如果我們把各層是一個整體的話,這四層之間,他應該是個棧,為什么啊,因為你堆這個酒杯塔的時候,先是第一層吧,再是第二層,再是第三層,再是第四層吧,拿的時候呢,拿的時候就正好相反,先拿最上層的,對同一層來說,是有很多,那就不算是棧了,我們從大的層次來說它是一個棧的結構,便于大家理解實際上最容易理解的是這個,每次我們畫創建對象時候的棧內存,每調用一個方法,調用main方法的時候,他是不是要開辟一塊空間,main方法里面調用show方法啦,他是不是要再開辟一塊空間,show里面再調用一個方法,他就要再開辟一塊空間,這個空間該怎么辦,是不是向上摞的,這一塊我給大家畫一下,我們開始調用方法了,首先我們有一個方法,在這里畫了一個方法,這個方法我們在這里標記一下,main方法,他調了一個方法show方法,這個方法叫show,mainf方法里面放局部變量,main方法的局部變量,show里面是放show里面的局部變量,如果show方法又調用了一個方法,怎么辦,比如取個名字,叫add,然后又怎么了,大家看這個像不像一個入棧,出去的時候誰先出去,是不是add方法執行完了空間釋放了,我之前的show方法的數據還有嗎,有,show在下面,都在下面保存著,當你add彈出的時候,show方法的數據是不是也可以操作了,show方法你能去操作main嗎show方法也調用完了,彈出了,是不是又回到main方法里面,等main方法也執行完了,棧變成空的了,這就是我們所說的棧4個字來概括他,叫后進先出,記住他的特點,后進先出表,Last In First Out,棧是這樣的一種結構.那對于這個棧來說呢,大家重點記住3個詞語,一個叫push,一個叫pop,一個叫peek,我們也不要記get,為什么要記這些,push是誰,push就是入棧,我把你推進去,pop彈出,出棧,相當于刪除操作,peek獲取棧的元素,獲取頂部元素,push入棧pop出棧,peek獲取棧頂元素,這是我們所說的一個棧,他的存儲結構呢,同樣,可以采用順序結構比如數組,也可以怎么辦,也可以采用鏈式存儲結構鏈棧,順序棧和鏈棧,只不過說比我們的線性結構表要簡單,為什么,因為限定位置了,這個大家知道就可以了,存儲結構可以采用數組,也可以采用鏈表,叫順序棧和鏈棧,棧的話就記住這些基本的概念, 下面我們來看一下一個兄弟,這個兄弟叫隊列.什么叫隊列呢?每次打飯的時候是不是都要排隊啊,先來后到嗎,棧是先進后出的,隊列是先進先出的,隊列叫queue,簡稱隊,他同樣是運算受限的線性表,他怎么受限制的,它是在表的一端插入,另外一端刪除,插入的這一端我們叫做隊尾,排隊的話你要排到最后面,能不能排到最前面,刪除的這一端叫隊首,特別容易理解吧,插入元素叫入隊,刪除元素叫出隊,他最大的優點就像我們吃飯排隊,地鐵排隊一樣,這就會變成先進先出,生活中這樣的例子有沒有啊,像超市的購物車,你看排成了一個隊列,推車子的時候不用的時候放在最后,使用的時候使用最前面的就可以了,包括我們排隊的,地鐵排隊,那先排隊的是先進,后排隊的要站到最后,這個沒有什么任何的難度生活案例,排隊打飯,排隊進地鐵站,還有上地鐵,都要排隊技術案例:多線程的時候我們CPU只有一個,那怎么辦啊,那就排隊,有什么就緒隊列,有什么堵塞隊列,到時候我們會給大家來講,這個大家要知道對于隊列來說我們主要是要掌握兩個操作,一個叫入隊,一個叫出隊,注意兩個單詞,Queue隊列是它,enqueue是入隊,dequeue這個單詞是出隊,記住這兩個單詞,peek好像剛用過,獲取隊首元素,這就是我們關于隊列的相關內容,再看他的存儲結構順序隊列,第二個采用鏈式隊列,還是這兩種存儲結構方法1: 采用數組做存儲結構,這個結構我們來看一下,我們把它理解為一個數組就可以了,初始狀態是一個元素也沒有,front這是一個頭指針,rear是尾指針,先加一個A,再加一個B,再加個C,再加個D,再加E,如果我再加個F,F要入隊了,當你把F寫到這兒的話,這個指針就要變了,就要指向F了,指向他就可以了,我們再隨便加一個Z,那么rear指針又成了6了,這叫入隊,現在front是0,然后出隊,誰出隊啊,A出去,A出去之后,front怎么辦,front指向1了,B要是再出去,front就指向2了,D要是再出去呢,front就指向3了,你有沒有發現這個時候出了一個問題,出了什么問題,別忘了我們這個時候是一個數組,我們現在畫的是一個數組,結果到最后出現一個什么情況了,你的頭是誰啊,結果導致前面的數組都變成空了,這不是都浪費了嗎,這時候我們該怎么辦,如果單純的采用數組來做的話,會存在這么一個問題,有人說那我有辦法啊,如果A一刪,我就讓B到A的位置,那這樣效率最低了,那肯定是不合適的,有沒有解決的辦法啊,給大家一個思路,如果采用普通的數組就會導致front之前的數據丟失了,浪費了,閑置了,怎么辦,采用循環數組方法2: 就是使用循環數組,就是收尾相連嗎,實際上還是一個數組,只不過我們可以怎么來理解呢,rear如果滿了之后呢,數組一共分了5個空間,rear末尾已經到了最后一個元素了,如果再入隊的話,可以入隊到第一個,入到前面去,但是指針的變化需要做相關的一個記錄,在這里我提一下就可以了 對于鏈式隊列來說呢,怎么辦?同樣的他為了處理方便,他增加了一個頭結點,如果你想按照他這個來做,我想入隊該怎么辦,入隊你是不是要創建一個新的結點,入隊就是添加一個元素,它的往最后加,我要出隊呢,出隊是誰啊,目前這隊列里出隊誰出隊,a0出隊,那a0怎么就出隊了,把它刪了,怎么就把它刪了,front存的地址值就要執行a1了,這就是一個出隊操作棧和隊列不是我們的一個重點,我們掌握它的相關的基本理論,在這里我們再講一個雙端隊列,叫deck,什么叫雙端隊列?這是個前端,這是個后端,之前我們是怎么回事,這個是進的,這個是出的,現在變了,這一端既可以出也可以進,這一端既可以進也可以出,雙端隊列,兩端都可以進隊和出隊,這個大家記住了,底層這里還可以是數組,或者鏈表,這是一個,這是一個最完整的雙向隊列,實際開發中可能還會有這樣的一些需求,輸出受限的雙向隊列,還有一個輸入受限的雙向隊列,什么叫輸出受限,這邊可以進,這邊也可以進但是出的話只能這邊出,是不是輸出受限啊,還有一個輸入受限,就是這一端可以出,這一端也可以出,但是進的話只能這一端進,和我們規定的只有一端可以進,一端可以出,那就成我們普通的隊列了,如果我們的雙端隊列,規定只能這邊進,只能這邊出,就成了棧了,雙端隊列既可以做隊列操作,也可以做棧操作的,只要有一端受限他就成了棧了,你為什么講這個啊,JAVA里面就是這么來實現的,基本的理論 講到這里的話現在來看JAVA里的棧和隊列,Java里面的線性表有什么,有Vector,ArrayList,LinkedList,同樣等我們學了棧和隊列之后,JAVA里面有哪些棧和隊列呢,大家來看1. Stack類: 一看這個單詞就是棧,已經過時了,因為他的父類就是Vector,Vector過時了,他也就過時了,雖然他的名字取得特別好,但是我們以后不用他2. Queue: Java里面有這么一個類,Queue就是隊列的,他就是隊列類,如果我們想使用隊列的話,這個類就可以了,但是Queue是一個接口,他不是實現類3. Dequeue: 還有一個叫雙端隊列,叫Dequeue,雖然叫雙端隊列,但是在JAVA里面我們一般把它當做什么來對待的,當做棧來進行處理的,注意這都是兩個接口,我們最終要實現棧操作,或者隊列操作的話,是不是還得用他們的實現類,那他們的實現類是什么,我們打開我們的代碼看一下,public interface Deque<E> extends Queue<E> ,首先要明確它是一個接口,他的父接口是隊列Queue我們再來看隊列,public interface Queue<E> extends Collection<E>,隊列里面有哪些方法啊,一個入隊和一個出隊,就這樣的一些操作,我們在Deque里面增加哪些操作,在雙端隊列里面有哪些操作呢,又增加了相關的一些方法,E removeFirst();刪除第一個,E removeLast();刪除最后一個,E getFirst();獲取第一個,E getLast();獲取最后一個,void addFirst(E e);添加第一個void addLast(E e);添加最后一個,是不是兩端都可以進行添加和刪除操作,都是可以的,void push(E e);這里還有一個push,push是入棧,pop是出棧,peek獲取棧頂元素,這兩個都是接口,問他們的實現類是什么,他們的實現類在這里看還不好看,看API唄,Queue是隊列,已知的子接口,子接口Deque,他有什么實現類,有兩個,一個叫LinkedList,也就是LinkedList既可以做棧來用,也可以做隊列來用,還可以做線性表來用,LinkedList其實是非常特殊的實現類,他既可以做棧來用,也可以做隊列來用,還可以做線性表來用,都是可以的,既然是Linked,那當然是鏈表結構,這里還有一個ArrayDeque,從名字上來看,他是一個什么?他就是一個數組的結構,這個用的不多,如果你想采用數組結構的棧,或者隊列的話,請用這一個,就可以了,用它就行了,這就是我們講的相關的內容,Java里面實現隊列用Queue,實現棧的話就用Deque就可以了,但是他們有一個共同的實現類,我們用LinkedList,當然ArrayDeque就很少用了,底層采用的是數組結構的,LinkedList采用的是鏈表結構的,記住我這個結論,下面我們領著大家做一個例子 package com.learn.stackqueue;import java.util.Deque; import java.util.LinkedList;/*** 將10進制轉化為2進制* 首先這個規則大家知道嗎* 10進制變二進制怎么變大家知道嗎* 比如我這里又一個數13,把它變成二進制* 13除以2,商是2,余數是1,拿著6再除以2* 商是3,拿著3再做被除數,余數是1* 再除以2商是0,余數是1,倒著來* 我們要實現這個操作,跟什么有關系,肯定是用循環* 其實這是一個鏈式循環的經典案例,* 鏈式循環的時候可以做一下這個,循環條件是什么,商等于0* 循環操作是什么,循環操作是除以2,* 有人說我不覺得這和棧有什么關系,這個和棧又關系嗎?* 我們先把棧放到一邊,先復習一下while循環* 循環語句看大家做的怎么樣了* * 那棧和隊列的內容就講到這里了,* @author Leon.Sun**/ public class TestConvert {public static void main(String[] args) {/*** 第一步給定一個十進制數* 13做被除數的,n最后沒有變* 我們還得輸出n* 如果是31呢,因為再加個1就是2的5次方了*/// int n = 13;// int n = 31;/*** 15應該是4個1吧*/// int n = 15;/*** 有人說我也不知道結果對不對,我們可以使用計算器* 查看----程序員*/int n = 100;/*** 把十進制轉換為二進制* 我們定義一個變量被除數* t代表被除數,t等于n* 為什么要把它作為t,因為t被除數一直在發生變化* */int t = n;/*** 給個String,剛開始是個空的,* 這里就不用這個String了,*/// String str = "";/*** 定義一個空棧* 怎么定義,創建一個對象唄* Deque是接口啊,使用LinkedList就可以了* 創建了一個空棧*/Deque stack = new LinkedList(); /*** 循環第一步干什么*/do {/*** 第一步是求余數,除以2求余數,* 相當于我們剛剛做了什么操作,* 13除以2得到1了,* t對2取余數,*/int mod = t%2;/*** 我們要把它拼接起來*/// str = str + mod;/*** 我往前面加總可以了吧*/// str = mod + str;/*** 然后下面輸出這個余數唄* 輸出一下這個mod* 這個到時候我們會完善的* 這里不是輸出余數,而是入棧* 沒得到一個余數需要入棧* 怎么入棧,入棧是哪個單詞push* 讓余數進去,循環的過程中要入棧*/// System.out.println(mod);stack.push(mod);/*** 6是商,然后拿到商再做被除數* 我們把步驟寫的細一些,* result變成6了,下一次是被除數*/// int result = t / 2;/*** 使用商做被除數* 先把這個思路寫對了* 思路寫對了那我們就可以做了* 把result賦給t* 這兩步可以合成一步*/// t = result;t = t / 2;/*** 條件是什么意思* 當我們的商大于0* 條件是t大于0* t大于0就行了* 但是寫到這里好像和棧隊列沒有一點關系* 我們先輸出一下看結果怎么樣 1011* 這個1011是什么,是不是我們剛才得到的1011這個結果* 但是我們需要的結果不是1011,是需要倒著來,是1101,* 那該怎么辦,并且大家想一下,有沒有辦法,有,我想了一個辦法*/}while(t>0);/*** 輸出結果* 再加上一個str,但是這里還是1011,* 這不對,你看就這么得到了,注意到目前為止* 練習的只是循環,有一個小技巧,str往前面加,不要往后面加就可以了* 但是我有這么一種思想,我把棧用一下,我這里畫上一個棧,* 大家來看,我們第一次得到的余數是幾,是1,我把1寫到這兒,* 第二次我們得到的是0,把0寫到這兒,第三次得到的是1,* 第四次得到的也是1,你看是不是按照這個順序,出去的時候怎么辦,* 正好相反,是不是正好相反,出去的時候變成1101,是不是就得到我們的結果了* 我們按照這個思路來實現一下,該怎么辦,這個ln也不要*/System.out.print(n + "------->");/*** 輸出的時候是不是需要出棧了* 怎么出棧,估計得用循環了* 條件應該是什么啊,當棧非空就可以了* 我怎么知道他非空啊,不要緊人家都給你寫好了* isEmpty是否是空的*/while(!stack.isEmpty()) {/*** 不太對,ln不要了*/System.out.print(stack.pop());}} } 這個例子大家都做過,借助棧實現進制轉換通過棧和隊列我們學好什么?什么是棧什么是隊列?1. 棧和隊列首先都是線性表,他們都是線性結構,但是他們是操作受限制的線性表,什么操作受限制了,一個刪除,一個添加2. 棧是怎么回事,一端入棧和出棧,隊列是一端入隊一端出隊3. 棧有一個特點,后進先出,隊列有一個特點,先進先出4. 另外我們還有一個雙端隊列,這個大家要知道,JAVA里面是有這個實現的5. JAVA里面有哪些棧和隊列大家要知道,雙端隊列他的名字叫隊列,但是實際開發中我們把它當做棧來用的,我們現在在他的一端來插入和刪除,他就成了棧,

?

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的栈和队列(一级)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。