用Java代碼實(shí)現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)的基本方法歸納
鏈?zhǔn)綄?shí)現(xiàn):
在棧的一段添加和刪除元素,在棧中維護(hù)一個(gè)指向棧頂?shù)慕Y(jié)點(diǎn)和一個(gè)count變量指示棧的大?。?br />
private LinearNode top; //指向棧頂
private int count;//標(biāo)記棧的大小
每次出棧和壓棧在鏈表的表頭:(也可以再表尾,實(shí)現(xiàn)方式不一樣而已)
top--->元素1--->元素2--->元素3.........
實(shí)現(xiàn)(附帶測(cè)試main):
LinkedStack
package Stack; import Bag.LinearNode; //為了重點(diǎn)來(lái)實(shí)現(xiàn)算法,將異常情況直接打印出然后退出程序,不再聲明異常類 public class LinkedStack implements StackADT { private LinearNode top; //指向棧頂 private int count;//標(biāo)記棧的大小 public static void main(String[] args){ LinkedStack stack = new LinkedStack(); System.out.println("將0到10依次壓棧"); for(int i = 0;i < 10;i++) stack.push(i); System.out.println("連續(xù)執(zhí)行5次出棧操作"); for(int i = 0;i < 5;i++) stack.pop(); System.out.println("棧為空嗎?: " + stack.isEmpty()); System.out.println("棧的大小為: " + stack.size()); System.out.println("棧頂元素為: " + stack.top.getElement()); System.out.println("棧頂元素為: " + stack.peek()); } public LinkedStack() { top = null; count = 0; } public int size() { return count; } public boolean isEmpty() { return (size() == 0); } public void push(Object element) { LinearNode node = new LinearNode(element); node.setNext(top); top = node; count++; } public Object pop() { if(isEmpty()) { System.out.println("stack is empty!"); System.exit(1); } Object result = top.getElement(); top = top.getNext(); count--; return result; } public Object peek() { Object result = top.getElement(); return result; } }
運(yùn)行結(jié)果:
將0到10依次壓棧
連續(xù)執(zhí)行5次出棧操作
棧為空嗎?: false
棧的大小為: 5
棧頂元素為: 4
棧頂元素為: 4
數(shù)組實(shí)現(xiàn):
棧底總是數(shù)組下標(biāo)為0的位置,入棧出棧從數(shù)組下標(biāo)的最后一個(gè)元素開(kāi)始:
private Object[] contents; private int top;//top標(biāo)記下一個(gè)入棧的位置,同時(shí)也表示棧的容量大小,跟鏈?zhǔn)綄?shí)現(xiàn)的count比較一下!?。?
實(shí)現(xiàn)(附帶測(cè)試main):
ArrayStack
package Stack; public class ArrayStack implements StackADT { private Object[] contents; private int top;//top標(biāo)記下一個(gè)入棧的位置,同時(shí)也表示棧的容量大小,跟鏈?zhǔn)綄?shí)現(xiàn)的count比較一下?。?! private static int SIZE = 10; public ArrayStack() { contents = new Object[SIZE]; top = 0; } public void expand(){//借助于申請(qǐng)一個(gè)輔助空間,每次擴(kuò)展容量一倍 Object[] larger = new Object[size()*2]; for(int index = 0;index < top;index++) larger[index] = contents[index]; contents = larger; } public int size() { return top; } public boolean isEmpty() { return (size() == 0); } public void push(Object element) { //if(isEmpty()) //expand(); if(top == contents.length) expand(); contents[top] = element; top++; } public Object pop() { if(isEmpty()) { System.out.println("stack is empty!"); System.exit(1); } Object result = contents[top-1]; contents[top-1] = null;//出棧 top--; return result; /*書(shū)上這樣寫(xiě)簡(jiǎn)便一點(diǎn)::: * top--; * Object result = contents[top]; * contents[top] = null;*/ } public Object peek() { Object result; if(isEmpty()) result = null; else result = contents[top-1]; return result; } public static void main(String[] args) { ArrayStack stack = new ArrayStack(); System.out.println("將0到24依次壓棧,然后連續(xù)10次出棧"); for(int i = 0;i < 25;i++) stack.push(i); for(int i = 0;i < 10;i++) stack.pop(); System.out.println("棧的大小為: " + stack.size()); System.out.println("棧為空嗎?: " + stack.isEmpty()); System.out.println("棧頂元素為: " + stack.peek()); } }
運(yùn)行結(jié)果:
將0到24依次壓棧,然后連續(xù)10次出棧
棧的大小為: 15
棧為空嗎?: false
棧頂元素為: 14
使用集合LinkedList來(lái)模擬棧
方法
java的泛型可以讓LinkedList模擬存儲(chǔ)各種數(shù)據(jù)類型的棧,包括int,double,String,Object等等,介紹一下幾種用到的API接口:
入棧
void addFirst(E e); // 將指定元素插入此列表的開(kāi)頭
獲取棧頂元素
E getFirst(); // 返回此列表的第一個(gè)元素
出棧
E removeFirst(); // 移除并返回此列表第一個(gè)元素
判???/p>
boolean isEmpty(); // 判斷???
示例代碼
import java.util.LinkedList; import java.util.NoSuchElementException; public class SimulateStack { private LinkedList<Integer> stack = new LinkedList<Integer>(); public boolean isEmpty() { return this.stack.isEmpty(); } public void push(int data) { this.stack.addFirst(data); } public int pop() throws NoSuchElementException{ return this.stack.removeFirst(); } public int getTop() throws NoSuchElementException{ return this.stack.getFirst(); } public static void main(String args[]) { SimulateStack s = new SimulateStack(); s.push(1); s.push(2); s.push(3); while (! s.isEmpty()) { int data = s.getTop(); System.out.println(data); s.pop(); } } }
- 利用數(shù)組實(shí)現(xiàn)棧(Java實(shí)現(xiàn))
- 淺談Java數(shù)組的一些使用方法及堆棧存儲(chǔ)
- Java中使用數(shù)組實(shí)現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)實(shí)例
- JAVA中堆、棧,靜態(tài)方法和非靜態(tài)方法的速度問(wèn)題
- Java實(shí)現(xiàn)棧和隊(duì)列面試題
- java中棧和隊(duì)列的實(shí)現(xiàn)和API的用法(詳解)
- Java編程思想里的泛型實(shí)現(xiàn)一個(gè)堆棧類 分享
- Java使用Deque實(shí)現(xiàn)堆棧的方法
- java使用泛型實(shí)現(xiàn)棧結(jié)構(gòu)示例分享
- JAVA基于靜態(tài)數(shù)組實(shí)現(xiàn)棧的基本原理與用法詳解
相關(guān)文章
mybatis 多表關(guān)聯(lián)mapper文件寫(xiě)法操作
這篇文章主要介紹了mybatis 多表關(guān)聯(lián)mapper文件寫(xiě)法操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12Java面向?qū)ο缶幊蹋ǚ庋b/繼承/多態(tài))實(shí)例解析
這篇文章主要介紹了Java面向?qū)ο缶幊蹋ǚ庋b/繼承/多態(tài))實(shí)例解析的相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10Java數(shù)據(jù)結(jié)構(gòu)之圖的領(lǐng)接矩陣詳解
圖的領(lǐng)接矩陣存儲(chǔ)方式是用兩個(gè)數(shù)組來(lái)表示圖。一個(gè)一位數(shù)組存儲(chǔ)圖中頂點(diǎn)信息,一個(gè)二維數(shù)組存儲(chǔ)圖中的邊或弧的信息。本文將為大家重點(diǎn)介紹一下數(shù)據(jù)結(jié)構(gòu)中的圖的鄰接矩陣,快來(lái)跟隨小編一起學(xué)習(xí)吧2021-11-11JavaFx 中創(chuàng)建計(jì)時(shí)器的步驟詳解
本文介紹了如何在JavaFx中創(chuàng)建計(jì)時(shí)器,通過(guò)創(chuàng)建計(jì)時(shí)器界面、編寫(xiě)計(jì)時(shí)器邏輯以及關(guān)聯(lián)計(jì)時(shí)器按鈕,我們可以快速實(shí)現(xiàn)一個(gè)靈活可靠的計(jì)時(shí)器組件,本文能夠幫助讀者在 JavaFx 中成功實(shí)現(xiàn)自己的計(jì)時(shí)器功能,感興趣的朋友一起看看吧2023-11-11Fluent Mybatis,原生Mybatis,Mybatis Plus三者功能對(duì)比
本文主要介紹了Fluent Mybatis,原生Mybatis,Mybatis Plus三者功能對(duì)比,分享給大家,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08SpringBoot?分模塊開(kāi)發(fā)的操作方法
這篇文章主要介紹了SpringBoot?分模塊開(kāi)發(fā)的操作方法,通過(guò)在原項(xiàng)目新增一個(gè)maven模塊,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04AntDesign多環(huán)境配置啟動(dòng)過(guò)程詳解
這篇文章主要為大家介紹了AntDesign多環(huán)境配置啟動(dòng)過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11java的Jackson將json字符串轉(zhuǎn)換成泛型List
這篇文章主要介紹了java的Jackson將json字符串轉(zhuǎn)換成泛型List ,這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下。2017-02-02