精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

動圖演示:手擼堆棧的兩種實現方法!

開發 前端
正式開始之前,先和各位朋友聊聊公眾號后期的一些打算,后面的文章計劃寫一些關于數據結構和算法的內容,原因很簡單「底層結構決定上層建筑嘛」,對于框架滿天飛的今天,我們不止要學習如何使用框架,更要了解它的原理以及底層數據結構,只有這樣我們才能更好的應用它。

 [[343379]]

本文轉載自微信公眾號「Java中文社群」,作者磊哥  。轉載本文請聯系Java中文社群公眾號。  

正式開始之前,先和各位朋友聊聊公眾號后期的一些打算,后面的文章計劃寫一些關于數據結構和算法的內容,原因很簡單「底層結構決定上層建筑嘛」,對于框架滿天飛的今天,我們不止要學習如何使用框架,更要了解它的原理以及底層數據結構,只有這樣我們才能更好的應用它。

當然,除了上述原因之外,還有一個重要因素是為了搞定面試。

隨著軟件開發行業競爭的日益激烈,面試的難度也在逐漸增加,因為企業要從眾多的面試人中選出最優秀的人,只能提高面試的難度,而算法和數據結構比較燒腦的硬核技能之一,自然也就成了面試的首選科目。并且隨著時間的推移,算法和數據結構出現的頻率和占比也會不斷增加,因此為了順應時代發展的潮流,我們也要做一些調整,所以在后面的一些文章中,我會陸續更新一些關于算法和數據結構的文章,希望大家能夠喜歡。

PS:當然隨著智能系統的普及(如今日頭條和抖音),算法和數據結構在企業中應用也越來越多,因此學習算法和數據結構也是迫在眉睫的事了。

棧定義

棧(Stack)又叫堆棧(簡稱棧),它是在同一端進行插入和刪除數據的線性表。

棧是最基礎也是最常見的數據結構之一,它的數據結構和操作流程如下圖所示:

其中,允許進行插入和刪除的一端叫作棧頂(Top),另一端叫作棧底(Bottom),棧底固定,棧頂浮動。

當棧中的元素為零時,該棧叫作空棧。添加數據時一般叫作入?;蜻M棧(Push),刪除數據叫作出?;蛲藯?Pop)。棧是后進先出(Last In First Out,LIFO)的線性表。

物理結構 & 邏輯結構

在手擼算法之前,我們先來認識一下數據結構中的兩個重要概念:物理結構和邏輯結構。

當談到“物理”和“邏輯”一詞時,我們可以會想到數據庫中的邏輯刪除和物理刪除。

所謂的物理刪除是指通過刪除命令真實的將數據從物理結構中刪除的過程;而邏輯刪除是指通過修改命令將數據更改為“已刪除”的狀態,并非真實的刪除數據。

這里的邏輯結構和物理結構和上面的概念類似,所謂的物理結構是指可以將數據存儲在物理空間中,比如數組和鏈表都屬于物理數據結構;而邏輯結構則是用于描述數據間的邏輯關系的,比如本文要講的棧就屬于邏輯結構。

可能有些人看到這里就蒙了,沒關系,我這里舉一個例子你就明白了。

如果用人來表示物理結構和邏輯結構的話,那么真實存在的有血有肉的人就屬于物理結構,而人的思想和信念就屬于邏輯結構了。

自定義棧I:數組實現

通過上面的內容,我們知道了棧屬于邏輯結構,因此它的實現方式就可以有很多種了,比如數組的實現方式或者是鏈表的實現方式。那么我們就先用數組實現一下,棧的主要方法有:

① 定義結構

那么我們先來定義它的結構:

  1. public class MyStack<E> { 
  2.     private Object[] value = null; // 棧存儲容器 
  3.     private int top = -1; // 棧頂(的指針) 
  4.     private int maxSize = 0; // 棧容量 
  5.  
  6.     // 構造函數(初始化默認容量) 
  7.     MyStack() { 
  8.         this.maxSize = 10; 
  9.     } 
  10.  
  11.     // 有參構造函數 
  12.     MyStack(int initSize) throws Exception { 
  13.         if (initSize <= 0) { 
  14.             throw new Exception("棧容量必須大于 0"); 
  15.         } else { 
  16.             value = new Object[initSize]; 
  17.             maxSize = initSize; 
  18.             top = -1; 
  19.         } 
  20.     } 

其中棧中數據會存儲在 Object[] value 數組中,top 變量代表棧頂的指針,它其實存儲的是棧頂元素的下標,會隨著入棧不斷變化(后進先出),maxSize 表示棧的最大容量。

② 入棧

此方法是給棧添加數據的,實現代碼如下:

  1. // 入棧(數據添加) 
  2. public boolean push(E e) throws Exception { 
  3.     if (maxSize - 1 == top) { 
  4.         throw new Exception("入棧失敗,棧已滿"); 
  5.     } else { 
  6.         value[++top] = e; 
  7.         return true
  8.     } 

每次當有數據插入時,只需在數組中添加一個值,并將棧頂的下標 +1 即可。

入棧操作如下圖所示:

③ 出棧

此方法是刪除棧中的數據的,實現代碼如下:

  1. // 數據移除(出棧) 
  2. public E pop() throws Exception { 
  3.     if (top <= -1) { 
  4.         throw new Exception("移除失敗,棧中已無數據"); 
  5.     } else { 
  6.         return (E) value[top--]; 
  7.     } 

出棧只需刪除數組中棧頂數據(最后加入的數據),并修改棧頂下標 -1 即可。

出棧操作如下圖所示:

④ 數據查詢

除了以上操作方法之外,我們還需要添加一個查詢棧頂數據的方法:

  1. // 數據查詢 
  2. public E peep() throws Exception { 
  3.     if (top <= -1) { 
  4.         throw new Exception("移除失敗,棧中已無數據"); 
  5.     } else { 
  6.         return (E) value[top]; 
  7.     } 

⑤ 代碼測試

到此為止棧的數據結構就已經實現完了,接下來我們來測試一下:

  1. // 代碼測試 
  2. public static void main(String[] args) throws Exception { 
  3.     MyStack stack = new MyStack(10); 
  4.     stack.push("Hello"); 
  5.     stack.push("Java"); 
  6.     System.out.println(stack.peep()); 
  7.     stack.pop(); 
  8.     System.out.println(stack.pop()); 

以上程序的執行結果為:

Java

Hello

從上述代碼可以看出,我們添加棧的順序是 Hello、Java 而輸出的順序是 Java、 Hello 符合棧的定義(后進先出)。

自定義棧II:鏈表實現

除了數組之外,我們可以還可使用鏈表來實現棧結構,它的實現稍微復雜一些,我們先來看鏈表本身的數據結構:

使用鏈表實現棧的流程如下:

也就是說,入棧時我們將數據存儲在鏈表的頭部,出棧時我們從頭部進行移除,并將棧頂指針指向原頭部元素的下一個元素,實現代碼如下。

我們先來定義一個鏈表節點:

  1. public class Node { 
  2.     Object value; // 每個節點的數據 
  3.     Node next; // 下一個節點 
  4.  
  5.     public Node(Object value) { 
  6.         this(value, null); 
  7.     } 
  8.  
  9.     /** 
  10.      * 創建新節點 
  11.      * @param value 當前節點數據 
  12.      * @param next  指向下一個節點(頭插法) 
  13.      */ 
  14.     public Node(Object value, Node next) { 
  15.         this.value = value; 
  16.         this.next = next
  17.     } 

接下來我們使用鏈表來實現一個完整的棧:

  1. public class StackByLinked { 
  2.  
  3.     private Node top = null; // 棧頂數據 
  4.     private int maxSize = 0; // 棧最大容量 
  5.     private int leng = 0; // 棧實際容量 
  6.  
  7.     public StackByLinked(int initSize) throws Exception { 
  8.         if (initSize <= 0) { 
  9.             throw new Exception("棧容量不能小于等于0"); 
  10.         } 
  11.         top = null
  12.         maxSize = initSize; 
  13.         leng = 0; 
  14.     } 
  15.  
  16.     /** 
  17.      * 容量是否已滿 
  18.      * @return 
  19.      */ 
  20.     public boolean isFull() { 
  21.         return leng >= maxSize; 
  22.     } 
  23.  
  24.     /** 
  25.      * 是否為空 
  26.      * @return 
  27.      */ 
  28.     public boolean isEmpty() { 
  29.         return leng <= 0; 
  30.     } 
  31.  
  32.     /** 
  33.      * 入棧 
  34.      * @param val 
  35.      * @return 
  36.      * @throws Exception 
  37.      */ 
  38.     public boolean push(Object val) throws Exception { 
  39.         if (this.isFull()) { 
  40.             // 容量已滿 
  41.             throw new Exception("容量已滿"); 
  42.         } 
  43.         top = new Node(val, top); // 存入信息,并將當前節點設置為頭節點 
  44.         leng++; 
  45.         return true
  46.     } 
  47.  
  48.     /** 
  49.      * 出棧(移除) 
  50.      * @return 
  51.      * @throws Exception 
  52.      */ 
  53.     public Node pop() throws Exception { 
  54.         if (this.isEmpty()) { 
  55.             throw new Exception("棧為空,無法進行移除操作"); 
  56.         } 
  57.         Node item = top; // 返回當前元素 
  58.         top = top.next
  59.         leng--; 
  60.         return item; 
  61.     } 
  62.  
  63.     /** 
  64.      * 查詢棧頂信息 
  65.      * @return 
  66.      */ 
  67.     public Node peek() throws Exception { 
  68.         if (isEmpty()) { 
  69.             throw new Exception("你操作的是一個空棧"); 
  70.         } 
  71.         return top
  72.     } 
  73.  
  74.     // 代碼測試 
  75.     public static void main(String[] args) throws Exception { 
  76.         StackByLinked stack = new StackByLinked(10); 
  77.         stack.push("Hello"); 
  78.         stack.push("Java"); 
  79.         System.out.println(stack.peek().value); 
  80.         stack.pop(); 
  81.         System.out.println(stack.pop().value); 
  82.     } 

以上程序的執行結果是:

Java

Hello

總結

本文我們使用了數組和鏈表等物理結構來實現了棧,當然我們也可以使用其他容器來實現,比如 Java 中的 List,我們只需要保證在操作棧時是后進先出的執行順序,并且至少包含 3 個重要方法:入棧、出棧和查詢棧頂元素就可以了。

最后

算法和數據結構的學習是 3 分學 7 分練,只看不練是沒辦法學好算法的,而且學習算法和數據結構是一個循序漸進的過程,短時間內不會有明顯的收效。因為這些算法經過了幾百年的發展和積累才得以流傳下來的,所以想要“玩得轉”還需要一點耐心。

這里給你講一個學習算法的“秘訣”:看不懂的知識要反復看,如果反復看還是看不懂,那么別著急,休息一下再繼續看!相信我,對于學習算法這件事,所有人的過程都是一樣的。

 

責任編輯:武曉燕 來源: Java中文社群
相關推薦

2012-10-16 09:40:38

洗牌算法

2010-10-14 14:33:15

MySQL多表聯查

2011-08-09 13:50:01

iPhone動畫UIView

2015-08-07 14:34:11

Windows 10安裝補丁

2013-06-27 09:26:50

Android界面刷新

2022-02-09 07:03:01

SpringNacos服務注冊

2010-04-25 17:34:30

負載均衡實現

2020-10-21 08:17:11

隊列數據

2011-06-23 09:07:16

2022-02-21 08:18:38

option編程模式

2010-07-14 10:30:26

Perl多線程

2021-12-08 10:47:35

RabbitMQ 實現延遲

2020-08-03 08:10:52

UDPTCP通信

2017-11-16 09:20:20

內存虛擬化技術

2010-09-17 09:37:27

Java安裝方法

2009-09-25 14:04:09

Hibernate eHibernate h

2011-03-03 17:00:37

pure-ftpdchroot

2010-11-19 11:57:15

Oracle密碼丟失

2010-07-05 16:37:19

UML類圖

2021-10-09 09:15:01

Windows 11安全模式系統
點贊
收藏

51CTO技術棧公眾號

伊人久久五月天| 欧美日韩国产精品一区| 91精品国产99久久久久久红楼| 天天综合天天做| 久久资源综合| 欧美少妇性性性| 国产va亚洲va在线va| 邻家有女韩剧在线观看国语| 精品无人码麻豆乱码1区2区| 91av在线国产| 成熟的女同志hd| 亚洲警察之高压线| 日韩精品一区二区三区在线| 福利在线一区二区三区| 女人黄色免费在线观看| 国产无一区二区| 国产精品av一区| 这里只有精品6| 亚洲欧美日韩国产一区二区| 久久91超碰青草是什么| 国产午夜福利一区| 精品深夜福利视频| 日韩欧美在线一区二区三区| 蜜桃免费在线视频| 麻豆视频在线观看免费网站黄| 成人免费在线播放视频| 欧洲在线视频一区| 三区在线观看| 99精品视频中文字幕| 亚洲japanese制服美女| 中文字幕人妻一区二区在线视频 | 久久福利在线| 色综合久久久久网| 欧美成人三级在线视频| 欧美人与禽性xxxxx杂性| 国产精品久久久久久久久免费樱桃| 黑人中文字幕一区二区三区| 精品国产黄色片| 狠狠色丁香久久婷婷综合_中| 国产成人精品电影| 黄色av网站免费观看| 国产精品久久777777毛茸茸| 久久久久久91香蕉国产| 久久一二三四区| 欧美深夜福利| 欧美黑人又粗大| 国产一级片免费| 国内自拍视频一区二区三区| 久久99久久99精品中文字幕 | 国产精品自拍小视频| 一级黄色在线视频| 日韩精品三区四区| 国产精品久久久久久久av大片| 性色av免费观看| 石原莉奈在线亚洲三区| 国产91精品在线播放| 无码无套少妇毛多18pxxxx| 视频一区中文字幕国产| 国产精品18久久久久久麻辣| 日韩国产成人在线| 麻豆精品在线观看| 91在线观看免费| 午夜精品久久久久久久爽 | 亚洲第一黄色网址| 你微笑时很美电视剧整集高清不卡| 日韩毛片在线观看| 西西444www无码大胆| 欧美h版在线| 久久91亚洲人成电影网站| 免费中文字幕在线观看| 99成人精品| 国产不卡精品视男人的天堂| 又骚又黄的视频| 国模少妇一区二区三区| 国产传媒一区二区| 你懂的视频在线| 国产精品久久国产精麻豆99网站| 一区精品在线| 波多野结衣在线高清| 欧美性色视频在线| 免费av不卡在线| 精品国产乱子伦一区二区| 亚洲精品一区二区在线| jizz日本在线播放| 激情综合电影网| 国产91色在线|免| 国产精品探花视频| 2021国产精品久久精品| 不卡中文字幕在线| 伊人网在线播放| 欧美精品一级二级三级| 日本少妇毛茸茸| 天天av综合| 青青草成人在线| 国产欧美久久久精品免费| av亚洲精华国产精华| 亚洲一区二区三区加勒比 | 999国产精品999久久久久久| 欧美极品在线视频| 一级黄色a视频| aaa欧美日韩| 91免费视频黄| 日韩精品一区二区三区av| 欧美va亚洲va香蕉在线| 国产18无套直看片| 日韩五码在线| 91传媒在线免费观看| 精品欧美不卡一区二区在线观看 | 国产一区二区三区在线免费观看| 久草网站在线观看| 日产国产高清一区二区三区| 国产视频一区二区三区四区| 九七久久人人| 欧美亚一区二区| 亚洲制服丝袜在线播放| 久久久久免费av| 国产精品久久97| 日韩精品系列| 午夜视频久久久久久| 精品人妻一区二区三区免费| 精品国产乱码久久久| 97视频人免费观看| 亚洲爱爱综合网| 综合久久综合久久| 男女视频在线看| 免费看日本一区二区| 国内伊人久久久久久网站视频| 国产麻豆一精品一男同| 国产精品乱人伦中文| 日韩有码免费视频| 最新亚洲精品| 欧美亚洲在线播放| 天堂在线中文字幕| 午夜精彩视频在线观看不卡| 欧美图片自拍偷拍| 国产精品videosex极品| 97操在线视频| 青青草原av在线| 日韩视频一区在线观看| 澳门黄色一级片| 国产乱国产乱300精品| 最新欧美日韩亚洲| www.成人在线.com| 久久精品视频在线观看| 国产日韩欧美一区二区东京热| 国产精品视频yy9299一区| 九九视频精品在线观看| 国产亚洲精品美女久久久久久久久久| 欧美亚洲在线视频| 韩国三级av在线免费观看| 色偷偷成人一区二区三区91| wwwwww日本| 日韩在线观看一区二区| 日韩和欧美的一区二区| 外国电影一区二区| 久久精品国产久精国产思思| 国产欧美综合视频| 亚洲综合色成人| 中国极品少妇videossexhd| 国产精品美女| 亚洲乱码一区二区三区| 99亚洲男女激情在线观看| 蜜臀久久99精品久久久无需会员 | 欧美日韩性生活片| 五月综合久久| 国产精品视频免费在线观看| 麻豆视频在线免费观看| 日韩视频在线观看一区二区| 国产成人在线播放视频| 久久精品亚洲国产奇米99| 孩娇小videos精品| 欧美日韩免费| 欧美激情第六页| 伊人国产精品| 久久免费视频观看| 国产免费a∨片在线观看不卡| 欧美日韩国产美| 国产精品成人国产乱| 久久人人爽人人爽| 色噜噜狠狠一区二区三区狼国成人| 国产在线欧美| 日韩欧美激情一区二区| 日韩在线亚洲| 日本中文字幕不卡免费| 国产在线看片| 日韩成人网免费视频| 中文字幕一区二区人妻| 亚洲国产中文字幕| 女人裸体性做爰全过| 成人毛片在线观看| 波多野结衣天堂| 精品av久久久久电影| 无遮挡亚洲一区| 欧美成人一区在线观看| 成人妇女淫片aaaa视频| 在线中文字幕播放| 欧美不卡视频一区发布| 国产一二三在线观看| 精品三级在线看| 亚洲无码精品在线观看| 亚洲图片自拍偷拍| 久久久久久久久久97| 久久影视一区二区| 中国特级黄色大片| 精品一区二区三区的国产在线播放| 18岁网站在线观看| 欧美成人日韩| 亚洲一区二区精品在线观看| 日韩深夜福利| 成人av影视在线| 国产精品一区二区美女视频免费看| 欧美一级片在线播放| 色女人在线视频| 久久久国产91| 伊人免费在线| 国产亚洲福利一区| 天天操天天干天天干| 日韩欧美一区电影| 国产孕妇孕交大片孕| 欧美在线你懂的| 久久精品视频7| 五月综合激情网| 免费在线一级片| 一区二区成人在线视频| 亚洲欧美精品久久| 欧美高清在线一区| 精品人妻一区二区三区蜜桃视频| 91亚洲永久精品| 日韩少妇一区二区| 成人精品视频一区二区三区 | 中文字幕欧美日本乱码一线二线| 漂亮人妻被黑人久久精品| 国产sm精品调教视频网站| 成人免费黄色av| 久久狠狠亚洲综合| 一区二区三区欧美精品| 久国产精品韩国三级视频| 国产一二三区av| 久久国产尿小便嘘嘘| 依人在线免费视频| 精品一区二区三区的国产在线播放| 日韩中文字幕a| 久久99在线观看| 亚洲网中文字幕| 国产一区福利在线| 老女人性生活视频| 丰满岳乱妇一区二区三区 | 国产日韩欧美不卡在线| 亚洲av无码一区二区三区人| 国产欧美一区二区精品婷婷| 欧美丰满美乳xxⅹ高潮www| 国产欧美日韩另类一区| 欧美福利在线视频| 亚洲色图在线视频| 免费麻豆国产一区二区三区四区| 亚洲精品国产视频| 久久亚洲国产成人精品性色| 精品久久久精品| 黄色大全在线观看| 91麻豆精品久久久久蜜臀| 国产乱码精品一区二三区蜜臂 | 91久久在线视频| 精品999日本久久久影院| 99九九视频| 偷拍亚洲色图| 日韩欧美三级一区二区| 欧美r级电影| 97碰在线视频| 久久久久久夜| 亚洲免费在线播放视频| 成人h精品动漫一区二区三区| 97人妻精品一区二区三区免| 欧美国产激情二区三区 | 欧美午夜xxx| 91久久精品无码一区二区| 欧美本精品男人aⅴ天堂| 青青青草原在线| 日韩色av导航| 538在线精品| 国产精品综合不卡av| 好吊妞国产欧美日韩免费观看网站| 蜜桃视频在线观看成人| 国产精品久久天天影视| 欧美日韩性生活片| 毛片av一区二区| 人体私拍套图hdxxxx| 中文字幕精品—区二区四季| 久久久久久久久久久久久久久久久| 欧美日韩精品二区| 国产手机精品视频| 亚洲精品视频免费| 成人av福利| 国产suv精品一区二区三区88区| 91精品视频一区二区| 蜜桃传媒一区二区| 国产精品啊v在线| 亚洲第一狼人区| av电影在线观看完整版一区二区| 欧美日韩生活片| 欧美日韩国产精品一区| 国产熟女一区二区丰满| 夜夜嗨av色一区二区不卡| 超碰97免费在线| 成人写真福利网| 国产亚洲欧美日韩在线观看一区二区| 日韩激情视频一区二区| 久久精品99国产精品日本| 国产精品久久久免费观看| 亚洲三级电影网站| 成人小视频在线播放| 亚洲国产精品资源| 污污片在线免费视频| 国产免费久久av| 欧美男gay| 两根大肉大捧一进一出好爽视频| 国产一区欧美二区| 波多野结衣家庭教师在线观看| 日韩欧美亚洲成人| 狠狠综合久久av一区二区| 久久久精品免费视频| 国产精品无码久久久久| 日韩少妇中文字幕| 香蕉亚洲视频| 老熟妇精品一区二区三区| 亚洲精品乱码久久久久久日本蜜臀 | 自拍偷拍欧美专区| 日本激情综合网| 国产精品热久久久久夜色精品三区 | 高清国产在线一区| 国产精品va| jjzz黄色片| 一区二区激情小说| 精品久久无码中文字幕| 欧美成人久久久| 亚洲超碰在线观看| 亚洲区成人777777精品| 韩国女主播成人在线| 999精品在线视频| 欧美高清www午色夜在线视频| 97视频在线观看网站| 国产精品女人久久久久久| 精品久久综合| 天堂网在线免费观看| 国产精品久久久久影院| 国产精品丝袜黑色高跟鞋| 欧美剧在线观看| 日韩视频1区| 人妻无码久久一区二区三区免费| 成人丝袜视频网| 欧美videossex极品| 亚洲欧美一区二区三区在线| 天天免费亚洲黑人免费| 日韩欧美一区二区三区久久婷婷| 日韩电影免费在线观看网站| 一级黄色片网址| 欧美日本在线看| 日本精品600av| 久久精品五月婷婷| 日本v片在线高清不卡在线观看| wwwww黄色| 91麻豆精品国产自产在线观看一区 | 日本成年人网址| 国产免费成人在线视频| 亚洲一级片免费看| 欧美第一黄网免费网站| 欧美亚洲色图校园春色| 九一精品在线观看| 亚洲日本成人在线观看| 日韩一级片免费在线观看| 69av成年福利视频| 久久国产小视频| 中国特级黄色片| 色天天综合色天天久久| 麻豆网站在线| 久久精品成人一区二区三区蜜臀 | 亚洲在线观看av| 久久久999国产| 久久精品色综合| 手机看片福利盒子久久| 亚洲色图欧美激情| 少妇无码一区二区三区| 国产精品久久久久久搜索| 亚洲欧美综合久久久| 国产又粗又长又爽| 欧美精品少妇一区二区三区| free性欧美16hd| 亚洲欧美日韩综合一区| 成人动漫一区二区| 中文文字幕一区二区三三| 久久久久久亚洲| 欧美独立站高清久久| 国产激情第一页| 3751色影院一区二区三区| 精精国产xxxx视频在线野外| 亚洲一区二区三区乱码| 不卡高清视频专区| 夜夜嗨av禁果av粉嫩avhd| 性色av一区二区咪爱| 99久久精品国产亚洲精品 | 中文字幕伦av一区二区邻居|