Java數(shù)據(jù)結(jié)構(gòu)之棧的線性結(jié)構(gòu)詳解
一:棧
棧是限制插入和刪除只能在一個(gè)位置上進(jìn)行的表,此位置就是表的末端,叫作棧頂。
棧的基本操作分為push(入棧) 和 pop(出棧),前者相當(dāng)于插入元素到表的末端(棧頂),后者相當(dāng)于刪除棧頂?shù)脑亍?/p>
二:棧的實(shí)現(xiàn)
public class LinearStack { /** * 棧的初始默認(rèn)大小為10 */ private int size = 5; /** * 指向棧頂?shù)臄?shù)組下標(biāo) */ int top = -1; /** * 定義棧stack */ private int[] stack; public LinearStack() { stack = new int[size]; } /** * 判斷棧滿 */ public boolean isFull() { boolean result = false; if(top == size - 1) { result = true; } return result; } /** * 入棧操作push */ public void push(int value) { /** * 如果棧滿,拓展棧的容量 */ if(isFull()) stack = expansionStack(); top++; stack[top] = value; } /** * 出棧操作 */ public int pop() { if(top == -1) throw new RuntimeException("???!出棧失敗"); int result = stack[top] ; top--; return result; } /** * 擴(kuò)充容量 */ public int[] expansionStack() { size = size + 10; int[] stackTemp = new int[size]; for (int i = 0; i < stack.length; i++) { stackTemp[i] = stack[i]; } return stackTemp; } /** * 獲取棧頂?shù)脑? */ public int getTop() { return stack[top]; } /** * 顯示棧中的全部元素 */ public String toString() { String str = "["; for (int i = 0; i <= top; i++) { if(i == top) str = str + stack[i] + "]"; else str = str + stack[i] + ","; } return str; } }
三:棧的測試
public class LinearStackTest { public static void main(String[] args) { LinearStack linearStack = new LinearStack(); /** * 元素入棧 */ linearStack.push(1); linearStack.push(2); linearStack.push(3); linearStack.push(4); linearStack.push(5); /** * 棧滿,顯示棧中所有元素 */ System.out.println("0:arrayStack " + linearStack.toString()); /** * 再次入棧 */ linearStack.push(6); /** * 再次顯示占中的所有元素 */ System.out.println("1:arrayStack: " + linearStack.toString()); /** * 獲取棧頂元素 */ System.out.println("獲取棧頂元素:stack[top] = " + linearStack.getTop()+" top = " + linearStack.top); /** * 出棧 */ System.out.println("出棧:stack[top] = " + linearStack.pop()+" top = " + linearStack.top); /** * 再次顯示棧中的元素 */ System.out.println("2:arrayStack: " + linearStack.toString()); } }
四:棧的應(yīng)用(回文序列的判斷)
public class LinearStackChar { private int size = 5; /** * 指向棧頂?shù)臄?shù)組下標(biāo) */ int top = -1; /** * 定義棧stack */ private char[] stack; public LinearStackChar() { stack = new char[size]; } /** * 判斷棧滿 */ public boolean isFull() { boolean result = false; if(top == size - 1) { result = true; } return result; } /** * 入棧操作push */ public void push(char value) { /** * 如果棧滿,拓展棧的容量 */ if(isFull()) stack = expansionStack(); top++; stack[top] = value; } /** * 出棧操作 */ public char pop() { if(top == -1) throw new RuntimeException("???!出棧失敗"); char result = stack[top] ; top--; return result; } /** * 擴(kuò)充容量 */ public char[] expansionStack() { size = size + 10; char[] stackTemp = new char[size]; for (int i = 0; i < stack.length; i++) { stackTemp[i] = stack[i]; } return stackTemp; } /** * 獲取棧頂?shù)脑? */ public char getTop() { return stack[top]; } /** * 顯示棧中的全部元素 */ public String toString() { String str = "["; for (int i = 0; i <= top; i++) { if(i == top) str = str + stack[i] + "]"; else str = str + stack[i] + ","; } return str; } }
public class LinearStackCharTest { public static void main(String[] args) { /** * 判斷一個(gè)字符串a(chǎn)bcba是不是回文序列? * 思路:將字符串切割成為單個(gè)字符,存放在字符棧中; * 然后出棧,判斷出棧后字符數(shù)組組成的字符串是否和原字符串相等; * 相等--回文序列 * 不相等--不是回文序列 */ String str = "abcba"; LinearStackChar linearStackChar = new LinearStackChar(); //講字符串切割,存放在棧中 for (int i = 0; i < str.length(); i++) { linearStackChar.push(str.charAt(i)); } //存放完成,顯示棧中的元素 System.out.println("stack = " + linearStackChar.toString()); //出棧 String result = ""; int length = linearStackChar.top; System.out.println("top = " + length); for (int i = 0; i <= length; i++) { result = result + String.valueOf(linearStackChar.pop()); } //出棧組成的字符串 System.out.println("result = " + result); //判斷是否相等 System.out.println("result = abcba? " + (result.equals("abcba") ? true : false)); } }
總結(jié)
到此這篇關(guān)于Java數(shù)據(jù)結(jié)構(gòu)之棧的線性結(jié)構(gòu)的文章就介紹到這了,更多相關(guān)Java棧的線性結(jié)構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring啟動(dòng)錯(cuò)誤Singleton bean creation not al
本文主要介紹了spring啟動(dòng)錯(cuò)誤Singleton bean creation not allowed while the singletons of this factory are indestruction,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07jeefast和Mybatis實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)的示例代碼
這篇文章主要介紹了jeefast和Mybatis實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)的示例代碼,代碼簡單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Java 和 Kotlin Lambda 表達(dá)式示例詳解
Lambda 表達(dá)式是一種簡潔的函數(shù)表達(dá)方式,可以把函數(shù)作為一個(gè)方法的參數(shù),或者將代碼塊轉(zhuǎn)換為數(shù)據(jù)傳遞,這篇文章主要介紹了Java 和 Kotlin Lambda 表達(dá)式示例詳解,需要的朋友可以參考下2024-06-06Java字符串格式化,{}占位符根據(jù)名字替換實(shí)例
這篇文章主要介紹了Java字符串格式化,{}占位符根據(jù)名字替換實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10Java使用正則表達(dá)式進(jìn)行匹配且對(duì)匹配結(jié)果逐個(gè)替換
這篇文章主要介紹了Java使用正則表達(dá)式進(jìn)行匹配且對(duì)匹配結(jié)果逐個(gè)替換,文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(58)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你2021-08-08