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;
}
}
三:棧的測(cè)試
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)容請(qǐng)搜索腳本之家以前的文章或繼續(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à)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
jeefast和Mybatis實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)的示例代碼
這篇文章主要介紹了jeefast和Mybatis實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)的示例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
Java 和 Kotlin Lambda 表達(dá)式示例詳解
Lambda 表達(dá)式是一種簡(jiǎn)潔的函數(shù)表達(dá)方式,可以把函數(shù)作為一個(gè)方法的參數(shù),或者將代碼塊轉(zhuǎn)換為數(shù)據(jù)傳遞,這篇文章主要介紹了Java 和 Kotlin Lambda 表達(dá)式示例詳解,需要的朋友可以參考下2024-06-06
Java字符串格式化,{}占位符根據(jù)名字替換實(shí)例
這篇文章主要介紹了Java字符串格式化,{}占位符根據(jù)名字替換實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-10-10
Java使用正則表達(dá)式進(jìn)行匹配且對(duì)匹配結(jié)果逐個(gè)替換
這篇文章主要介紹了Java使用正則表達(dá)式進(jìn)行匹配且對(duì)匹配結(jié)果逐個(gè)替換,文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(58)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧,希望可以幫到你2021-08-08

