首页
/
每日頭條
/
圖文
/
算法入門複習
算法入門複習
更新时间:2024-11-28 07:25:01
算法入門之棧前言

了解完算法的基本數據結構鍊表和數組後,我們就可以開始了解基于這些基本數據衍生出來的其它數據結構,如堆、棧、隊列等,今天詳細聊聊棧,其它文章參考

數組簡介

鍊表簡介

什麼是棧

棧是一種線性結構,最常見的生活中的例子就是羽毛球筒

算法入門複習(算法入門之棧)1

羽毛球筒隻開放一端入口,那麼先放入的球一定是在底部,最後放入的球在最頂部,拿球時先獲取的就是靠近頂部的球,隻有不停的獲取才能将底部的球拿到。

棧也就是這樣,隻能從一端入棧和出棧,這種順序我們稱為FILO(First In Last Out)先進後出,最早進入的元素稱為棧底,最後進入的元素我們稱為棧頂,如下

算法入門複習(算法入門之棧)2

棧是鍊表和數組的基本數據的衍生結構,所以可以采用鍊表或者數據實現,具體思路如下

數組實現棧

用數組來實現棧太簡單,我們可以參考之前數組的相關文章

數組簡介

入棧就是在數組的尾部插入元素不涉及到數組元素移動,出棧就是将數組尾部的元素清除,示意圖如下

入棧

算法入門複習(算法入門之棧)3

出棧

算法入門複習(算法入門之棧)4

實現代碼

/** *用數組實現棧 */ classMyStack1{ //數組的實際大小 privateintsize; privateObject[]arr; publicMyStack1(intcapacity){ arr=newObject[capacity]; size=0; } //入棧 publicvoidpush(Objectdata){ if(size==arr.length){ thrownewRuntimeException("超過棧的最大容量"); } arr[size]=data; size ; } //出棧 publicObjectpull(){ if(size==0){ thrownewRuntimeException("棧為空!"); } Objectdata=arr[size-1]; //恢複數組指定位置默認值 arr[size-1]=null; size--; returndata; } publicvoidshow(){ System.out.println("打印棧存放數據:" Arrays.toString(arr)); } }

鍊表實現棧

鍊表實現棧同樣是尾部指針的移動,如下是鍊表實現的示意圖

算法入門複習(算法入門之棧)5

入棧就是将原隊尾的next指針指向新節點即可,而出棧就是将原隊尾節點的上一個節點的next指針指向null。

入棧

算法入門複習(算法入門之棧)6

出棧

算法入門複習(算法入門之棧)7

實現代碼如下

/** *用鍊表實現棧 */ classMyStack2{ //鍊表元素個數 privateintsize; //頭節點 privateNodehead; //尾節點 privateNodelast; //入棧 publicvoidpush(Objectdata){ Nodenode=newNode(data); if(size==0){ head=node; last=node; }else{ last.next=node; last=node; } size ; } //出棧 publicObjectpull(){ if(size==0){ thrownewRuntimeException("棧數據為空"); } Objectdata=last.data; if(size==1){ head=null; last=null; }else{ //獲取倒數第二個節點 Nodeindex=getIndex(size-2); index.next=null; last=index; } size--; returndata; } //獲取指定下标的元素從0開始 publicNodegetIndex(intindex){ if(index<0||index>=size){ thrownewRuntimeException("數組下标異常"); } Nodetemp=head; for(inti=0;i<index;i ){ temp=temp.next; } returntemp; } publicvoidshow(){ Nodetemp=head; while(temp!=null){ System.out.println(temp); temp=temp.next; } } } classNode{ //數據 Objectdata; //下一個節點指針 Nodenext; publicNode(Objectdata){ this.data=data; next=null; } @Override publicStringtoString(){ return"Node{" "data=" data ",next=" next '}'; } }

總結

從操作代碼可以看出,無論棧的實現方式是采用數組還是鍊表,入棧出棧都非常簡單僅僅是一個元素的移動,所以入棧和出棧操作時間複雜度都為O(1)。

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
非誠勿擾如何對待感情(男生缺乏儀式感被心動女生拒絕)
非誠勿擾如何對待感情(男生缺乏儀式感被心動女生拒絕)
  一個身穿漢服的男嘉賓來到《非誠勿擾》舞台相親,他是一位漢服的服裝店老闆。也許是因為喜歡漢服,他選擇了台上一位同樣穿着漢服的女嘉賓作為心動女生,兩人無論是外表還是服飾上都非常的般配。不少女嘉賓也隐約感受到她是為了漢服女生而來,因此選擇滅燈讓位。本以為漢服的女生會留燈,沒想到她卻滅了燈,理由是男嘉賓在VCR裡說自己缺乏“儀式感”,而她則是比較看重儀式感這個東...
2024-11-28
漫威鋼鐵俠淚目瞬間(漫威最燒錢的片段)
漫威鋼鐵俠淚目瞬間(漫威最燒錢的片段)
  喜歡漫威電影的小夥伴大家好,我是皮影匠!漫威電影之所以如此成功,除了精彩故事的設定以外,還有逼真的特效。衆所周知特效越多投資越高,就是因為漫威舍得花錢,才會帶來這麼多精彩的作品。那麼你知道在《複聯4》中哪些片段最燒錢嗎?         首先就是複仇者為了尋找寶石,準備穿越回到過去時的片段。除了演員是真實的以外,包括複仇者穿戴的戰甲全部都是特效合成的。根...
2024-11-28
cfpl ag 陣容(CFPL青訓選手哪家強)
cfpl ag 陣容(CFPL青訓選手哪家強)
  CFPL S16常規賽已經進行到了第六輪,可謂緊張激烈,精彩紛呈。本屆聯賽最大的特色,就是引入了很多新人,給觀衆帶來了耳目一新的感覺。除了一些替補選手外,大量青訓隊員的上陣成為賽場上一道靓麗的風景線。但說一千道一萬,歸根結底,無論隊伍的陣容怎樣變化,能夠獲勝才是最關鍵的。下面我們就來讨論一個有趣的話題,分析下這批新人中,究竟哪支戰隊的比較厲害。     ...
2024-11-28
王一博無名路演回答問題(無名路演有趣王一博斥黑粉)
王一博無名路演回答問題(無名路演有趣王一博斥黑粉)
  春節檔大戰還在繼續,由程耳執導梁朝偉王一博周迅主演的《無名》正在有條不紊地到指定城市的某個影院進行路演宣傳,正如一開始計劃的那樣。      《無名》講述的是上世紀二十年代奮鬥在上海的中共特科在隐蔽戰線裡與各方勢力殊死較量,以緻敬走向勝利過程中不可或缺的黨的秘密戰線上的那些無名英雄。   無名所選的路演城市也是當年被日軍轟炸過的,甚至路演順序與轟炸順序一...
2024-11-28
韓國blackpink人氣排名(外網票選K
韓國blackpink人氣排名(外網票選K
  怎麼每個女星都讓人超級心動的啦!   外國網站King Choice每年都會舉辦K-Pop女王選舉,由粉絲親自選出心中的K-Pop Queen。日前網站公開了2022年度的結果,去年BLACKPINK Jennie一度跌出5名以外,今年排名終于有上升但仍未登上冠軍之位?   K-Pop女皇TOP 20. Red Velvet Seulgi      K-...
2024-11-28
Copyright 2023-2024 - www.tftnews.com All Rights Reserved