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的事件發(fā)布與監(jiān)聽方式案例講解
今天去官網(wǎng)查看spring?boot資料時(shí),在特性中看見了系統(tǒng)的事件及監(jiān)聽章節(jié),所以下面這篇文章主要給大家介紹了關(guān)于SpringBoot事件發(fā)布和監(jiān)聽的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
Spring boot使用spring retry重試機(jī)制的方法示例
這篇文章主要介紹了Spring boot使用spring retry重試機(jī)制的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
利用Java異常機(jī)制實(shí)現(xiàn)模擬借書系統(tǒng)
這篇文章主要給大家介紹了利用Java異常機(jī)制實(shí)現(xiàn)模擬借書系統(tǒng)的相關(guān)資料,文中先對java異常機(jī)制進(jìn)行了簡單介紹,而后通過示例代碼介紹了java語言是如何實(shí)現(xiàn)一個(gè)控制臺版的模擬借書系統(tǒng),需要的朋友可以參考學(xué)習(xí),一起來看看吧。2017-04-04
Springboot 整合 Java DL4J 實(shí)現(xiàn)時(shí)尚穿搭推薦系統(tǒng)(實(shí)例代碼)
本文介紹了如何使用SpringBoot和JavaDeeplearning4j框架搭建一個(gè)時(shí)尚穿搭推薦系統(tǒng),文章詳細(xì)闡述了系統(tǒng)的技術(shù)架構(gòu)、數(shù)據(jù)集格式、Maven依賴配置、模型訓(xùn)練和預(yù)測代碼實(shí)現(xiàn),以及單元測試和預(yù)期輸出結(jié)果2024-10-10
Java多線程中的CountDownLatch詳細(xì)解讀
這篇文章主要介紹了Java多線程中的CountDownLatch詳細(xì)解讀,一個(gè)同步輔助類,在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個(gè)或多個(gè)線程一直等待,用給定的計(jì)數(shù) 初始化 CountDownLatch,需要的朋友可以參考下2023-11-11
如何用Java將數(shù)據(jù)庫的數(shù)據(jù)生成pdf返回給前端用戶下載
本文詳細(xì)介紹了使用SpringBoot、iText庫、MyBatis等技術(shù)從數(shù)據(jù)庫中選取數(shù)據(jù)并生成PDF文件的后端處理流程,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09
Java中弱引用和軟引用的區(qū)別以及虛引用和強(qiáng)引用介紹
很早Java API就添加了弱引用(WeakReference)和軟引用(SoftReference),但并不是所有的程序員都熟悉這兩個(gè)概念2014-04-04

