首页
/
每日頭條
/
圖文
/
算法入門複習
算法入門複習
更新时间:2026-06-20 06:32:56
算法入門之棧前言

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

數組簡介

鍊表簡介

什麼是棧

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

算法入門複習(算法入門之棧)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
推荐阅读
如何讓自己變得優秀的幾個小竅門(如何讓自己變得更加優秀)
如何讓自己變得優秀的幾個小竅門(如何讓自己變得更加優秀)
  要想優秀,首先要敢于伸手去夠那些更高的果子。很多時候把手伸出去、把腳踮起來,已經戰勝了90%的人。   如何讓自己變得更加優秀?   這裡準備了16條法則,希望對你有所幫助。   1   對自己的行為負責   當自己所處的境遇不好的時候,更要多看看自己身上的原因。   有一句話說,你現在在哪兒是你過去兩年來的選擇決定的;你兩年後在哪兒是你接下去兩年中的選...
2026-06-20
人過四十後看淡簡單的生活(人到四十以後隻有)
人過四十後看淡簡單的生活(人到四十以後隻有)
     塵世間太多的情感,總是虛無缥缈,如水中之月,霧裡看花,追不到,摸不着,守不住,又放不下。   深陷紅塵的我們,常常會迷失在塵世之中,行色匆匆的專注趕路,卻忘了自己,也忘了看看沿途的風景。   一晃,已過而立之年,步入了不惑之年,此時,沉穩,從容才是大境界。   俗話說:四十不惑。過了四十,哪些事情應該堅持,哪些事情應該扔掉,心裡應該有數了。   人...
2026-06-20
剪映教學新手入門從零開始(小白學剪映剪映入門學習)
剪映教學新手入門從零開始(小白學剪映剪映入門學習)
  #初學剪輯# #小白學習自媒體##剪映入門#各位友友們好!我寫這個微頭條也是希望更多的新手小白容易上手,其實這個剪輯軟件并不難學習。主要是學會使用之後的運用技巧和創作玩法。同樣的功能可以不同精彩效果的作品,有些可以疊加,有些可以組合,有些可以調換順序等,主要看個人的創意思維。   廢話不多說,下面直接上圖。   1、創作按鍵      大家打開剪映...
2026-06-20
五年級數學簡便運算題20道有答案(五年級數學簡便運算方法)
五年級數學簡便運算題20道有答案(五年級數學簡便運算方法)
     在孩子的小學數學中,數學的學習,基本内容包含:對數的認識,數的運算,圖形的認識以及運算,還有就是對數的應用,這幾個部分,但是在從1年級到6年級一直學習的一項内容,而且貫穿始終的,那就是簡便運算。   在整數範圍、小數範圍、分數範圍内都會作為一個内容重複出現,而這個内容也正是小學數學中的一個難點。   一、提取公因式   這個方法實際上是運用了乘法分...
2026-06-20
魔界大戰困難單人門檻怎麼打(魔界大戰超詳細攻略)
魔界大戰困難單人門檻怎麼打(魔界大戰超詳細攻略)
  魔界大戰就要更新了,為了讓各位能更快的打進魔界大戰副本裡,這裡提前給各位準備了魔界大戰所有BOSS的攻略,快來看看吧!   入場介紹      角色等級達到95級即可選擇魔界大戰頻道進入   頻道進入無需完成普雷主線任務和之後的主線任務(英雄模式為DPL型式,不掉落CP護石材料)         完成魔界大戰主線任務後會出現外傳任務:[護石]未知的石頭、...
2026-06-20
Copyright 2023-2026 - www.tftnews.com All Rights Reserved