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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

数据结构与算法—栈详解

發布時間:2025/3/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法—栈详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 什么是棧
  • 設計與介紹
    • 數組實現
      • 結構設計
      • push插入
      • pop彈出并返回首位
      • 其他操作
    • 鏈表實現
      • 結構設計
      • push插入
      • pop彈出
      • 其他操作
  • 實現代碼
      • 數組實現
      • 鏈表實現
      • 測試
  • 總結

什么是棧


百度百科上,棧是這么定義的:

  • 棧(stack)又名堆棧,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入?;驂簵?#xff0c;它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。

稍微介紹一下關鍵名詞:

  • 運算受限:也就是這個表你不能隨便的刪除插入。只能按照它的規則進行插入刪除。比如棧就只能在一端就行插入和刪除。同樣,隊列也是運算受限,只能在兩天操作。
  • 線性表:棧也是一種線性表,前面詳細介紹過線性表,它表達的是一種數據的邏輯關系。也就是在棧內各個元素是相鄰的。當然在具體實現上也分數組和鏈表實現,他們的物理存儲結構不同。但是邏輯結構(實現的目的)相同。
  • 棧頂棧底: 這個描述是偏向于邏輯上的內容,因為大家知道數組在末尾插入刪除更容易,而單鏈表通常在頭插入刪除更容易。所以數組可以用末尾做棧頂,而鏈表可以頭做棧頂。

棧的應用:

  • 棧的應用廣泛,比如你的程序執行查看調用堆棧、加減運算、甚至在搜索算法中dfs,替代遞歸等等。所以棧也是必須掌握的一門數據結構。很多規范也是棧,比如上圖放書拿書一樣!

設計與介紹

這里我們介紹數組實現的棧和鏈表實現的棧。

數組實現

結構設計

  • 對于數組來說,我們模擬棧的過程很簡單,因為棧是后進先出,我們很容易在數組的末尾進行插入和刪除。所以我們選定末尾為棧頂。所以對于一個棧所需要的基礎元素是 一個data數組和一個top(int)表示棧頂位置。
  • 那么初始話以及構造的函數代碼為:
private T data[]; private int top; public seqStack() {data=(T[]) new Object[10];top=-1; } public seqStack(int maxsize) {data=(T[]) new Object[maxsize];top=-1; }

push插入

棧的核心操作之一push:入棧操作。

  • 如果top<數組長度-1。入棧。top++;a[top]=value;
  • 如果top==數組長度-1;棧滿。

pop彈出并返回首位

  • 如果top>=0,棧不為空,可以彈出。return data[top--];
  • 如下圖,本來棧為1,2,3,4(棧頂),執行pop操作。top變為3的位置并且返回4;

其他操作

  • 其他例如peek操作時返回棧頂不彈出.所以只需滿足題意時候return data[top]即可。

鏈表實現

有數組實現,鏈表當然也能實現。對于棧的運算。大致可以分為兩種思路:

  • 像數組那樣在尾部插入刪除。大家都知道鏈表效率低在查詢。而查詢到尾部效率很低。而我們就算用了尾指針,可以解決尾部插入效率。但是依然無法解決刪除效率(刪除需要找到前節點).還需要雙向鏈表。前面雖然詳細介紹過雙向鏈表,但是這樣未免太復雜
  • 所以我們采用帶頭節點的單鏈表在頭部插入刪除,把頭部當中棧頂,這樣精了很多。插入直接在頭節點后插入。而刪除也直接刪除頭節點后第一個元素即可。

結構設計

長話短說,短話不說。直接上代碼就懂。
鏈表的節點

static class node<T> {T data;node next;public node() { }public node(T value){this.data=value;} }

基本結構:

public class lisStack <T>{int length;node<T> head;//頭節點public lisStack() {head=new node<>();length=0;}//其他方法 }

push插入

與單鏈表頭插入一致,如果不太了解請先看筆者隊線性表介紹的。

和數組形成的棧有個區別。就是理論上棧沒有大小限制(不突破內存系統限制)。不需要考慮是否越界。

  • 節點team入棧
  • 空鏈表入棧head.next=team;
  • 非空入棧team.next=head.next;head.next=team;

pop彈出

與單鏈表頭刪除一致,如果不太了解請先看筆者隊線性表介紹的。

和數組同樣需要判斷是否為空。

  • 節點team出棧
  • head指向team后驅節點。不需要考慮鏈表是否為1個節點。如果為1個節點,team.next=null.執行完畢head.next=null。變為空,滿足條件。

其他操作

  • 其他例如peek操作時返回棧頂不彈出.所以只需判空滿足題意時候return head.next.data即可。而length你可以遍歷鏈表返回長度,也可以動態設置(本文采取)跟隨棧長變化。其他操作直接看api。

實現代碼

數組實現

package 隊棧;public class seqStack<T> {private T data[];private int top;public seqStack() {data=(T[]) new Object[10];top=-1;}public seqStack(int maxsize){data=(T[]) new Object[maxsize];top=-1;}boolean isEmpty(){return top==-1;}int length(){return top+1;}boolean push(T value) throws Exception//壓入棧{if(top+1>data.length-1){throw new Exception("棧已滿");}else {data[++top]=value;return true;}}T peek() throws Exception//返回棧頂元素不移除{if(!isEmpty()){return data[top];}else {throw new Exception("棧為空");}}T pop() throws Exception{if(isEmpty()){throw new Exception("棧為空");}else {return data[top--];}}public String toString(){if(top==-1){return "";}else {String va="";for(int i=top;i>=0;i--){va+=data[i]+" ";}return va;}} }

鏈表實現

package 隊棧;public class lisStack <T>{static class node<T>{T data;node next;public node() { }public node(T value){this.data=value;}}int length;node<T> head;//頭節點public lisStack() {head=new node<>();length=0;}boolean isEmpty(){return head.next==null;}int length(){return length;}public void push(T value) {//近棧node<T> team=new node<T>(value);if(length==0){head.next=team;}else {team.next=head.next;head.next=team;}length++;}public T peek() throws Exception {if(length==0) {throw new Exception("鏈表為空");}else {//刪除return (T) head.next.data;}}public T pop() throws Exception {//出棧if(length==0) {throw new Exception("鏈表為空");}else {//刪除T value=(T) head.next.data;head.next=head.next.next;//va.nextlength--;return value;}}public String toString(){if(length==0) {return "";}else {String va="";node team=head.next;while(team!=null){va+=team.data+" ";team=team.next;}return va;}} }

測試

總結

  • 棧的邏輯比較簡單。很容易理解,實現起來也相對容易。但是要注意數組情況的界限問題。
  • 后面將介紹隊列,相比棧,隊列內容更豐富一些。難度也稍大一些。
  • 如果有不好需要改進還請指出!
  • 最后,喜歡的話可以關注公眾號:bigsai 持續分享(回復 數據結構 獲得精心準備資料一份!)

總結

以上是生活随笔為你收集整理的数据结构与算法—栈详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 乖疼润滑双性初h | 一级做a爱片性色毛片 | avtt亚洲| 午夜激情电影在线观看 | 亚洲精品乱码久久久久久日本蜜臀 | 午夜免费福利影院 | 三上悠亚ed2k| 日本h漫在线观看 | 自拍偷拍精品 | 亚洲色图av在线 | av视觉盛宴 | 黄瓜视频色版 | 国产精品欧美一区喷水 | 污视频在线播放 | 日日干狠狠干 | 肉丝超薄少妇一区二区三区 | a级黄色网址 | 国产伦精品一区二区三区在线 | 亚洲a一区 | 成人女同在线观看 | 制服丝袜一区 | 91网在线看 | 在线免费三级 | 天堂草在线观看 | 高h av| 邵氏电影《金莲外传2》免费观看 | 久久天堂视频 | 上海女子图鉴 | 天天爱天天色 | 亚洲一区二区在线观看视频 | 日韩亚洲欧美在线观看 | 亚洲2022国产成人精品无码区 | 黄色尤物视频 | 国产欧美视频一区二区三区 | 男生裸体视频网站 | 欧美在线一区二区三区 | 午夜一级黄色片 | 桃色在线视频 | 精品免费在线观看 | 久久成年视频 | 男人与雌宠物交h | 风流老熟女一区二区三区 | wwwxxx在线 | 一本色道久久88加勒比—综合 | 日韩在线免费看 | 狼人综合视频 | 日韩中文字幕免费在线观看 | 亚洲精选久久 | 国产成人综合网 | av动漫天堂| 国产午夜成人久久无码一区二区 | 日本国产中文字幕 | 国产视频不卡 | 国产婷婷在线观看 | av操操操 | 亚洲成人视屏 | cao在线视频 | 最近日韩免费视频 | 97国产精品视频人人做人人爱 | 操日本老太太 | 精品久久久久久无码中文野结衣 | 成人av视屏| 亚洲成人免费网站 | 永久免费未满蜜桃 | 深爱婷婷| 久久人妻一区二区 | 99re在线视频播放 | 中文字幕乱码人妻无码久久 | 精品在线播放视频 | 欧美国产在线视频 | 久久精品黄 | 欧美日韩不卡合集视频 | 久久神马 | 日本精品一区二区在线观看 | 51嘿嘿嘿国产精品伦理 | 99久久久国产精品免费蜜臀 | 午夜天堂在线观看 | 午夜精品视频在线 | 国产成人精品亚洲线观看 | 国产18禁黄网站免费观看 | 亚洲午夜小视频 | 人人艹在线 | 欧美亚洲国产日韩 | 国产精品porn | 国产欧美精品在线 | 美日韩精品一区二区 | 日本视频免费看 | www.超碰97.com | av电影在线不卡 | 日韩一级免费视频 | 亚洲五月六月 | 亚洲免费黄色 | 日韩免费高清视频网站 | sm国产在线调教视频 | 欧美激情精品久久久久久蜜臀 | 婷婷色在线观看 | 亚洲在线观看免费视频 | 日本黄色一区二区三区 | 男女高潮网站 |