?登神長(zhǎng)階
?第三神裝 Stack
? ?第四神裝?Queue??
目錄
??一.棧 Stack
??1.概念
???2.基本操作?
???3.相關(guān)OJ題??
???4.棧、虛擬機(jī)棧和棧幀的區(qū)別
??二.隊(duì)列 Queue
???1.概念
??2.基本操作
??三.總結(jié)與反思
??一.棧 Stack
??1.概念
????????在 Java 中,棧(Stack)是一種后進(jìn)先出(LIFO)的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)元素。在棧中,只有棧頂?shù)脑厥强梢?jiàn)的和可訪問(wèn)的,其他元素都被隱藏起來(lái),直到棧頂?shù)脑乇灰瞥驈棾?。Java 中的 java.util.Stack
類(lèi)實(shí)現(xiàn)了這種棧的數(shù)據(jù)結(jié)構(gòu),并且是線程安全的,繼承自 Vector
類(lèi)。
???2.基本操作?
方法
|
功能 |
Stack() | 構(gòu)造一個(gè)空的棧 |
E push(E e) | 將e入棧,并返回e |
E pop() | 將棧頂元素出棧并返回 |
E peek() | 獲取棧頂元素 |
int size() |
獲取棧中有效元素個(gè)數(shù)
|
boolean empty() | 檢測(cè)棧是否為空 |
示例
以下是一個(gè)使用 Stack
類(lèi)的簡(jiǎn)單示例:
import java.util.Stack;
public class StackExample {
public static void main(String[] args) {
Stack<String> stack = new Stack<>();
// 壓棧操作
stack.push("Java");
stack.push("Python");
stack.push("C++");
// 彈棧操作
String topLanguage = stack.pop();
System.out.println("彈出棧頂元素:" + topLanguage);
// 查看棧頂元素
String currentTop = stack.peek();
System.out.println("當(dāng)前棧頂元素:" + currentTop);
// 判空操作
if (stack.isEmpty()) {
System.out.println("棧為空");
} else {
System.out.println("棧不為空");
}
}
}
這個(gè)示例展示了棧的基本操作,包括壓棧、彈棧、查看棧頂元素和判空。棧在 Java 中常用于處理需要后進(jìn)先出順序的場(chǎng)景,例如表達(dá)式求值、逆序輸出等。
???3.相關(guān)OJ題??
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-859619.html
逆波蘭表達(dá)式
?
?
???4.棧、虛擬機(jī)棧和棧幀的區(qū)別
-
棧(Stack):
- 在計(jì)算機(jī)科學(xué)中,棧是一種數(shù)據(jù)結(jié)構(gòu),遵循后進(jìn)先出(LIFO)的原則,用于存儲(chǔ)和管理函數(shù)調(diào)用、局部變量和臨時(shí)數(shù)據(jù)。
- 棧通常由操作系統(tǒng)提供支持,用于管理程序的執(zhí)行環(huán)境和內(nèi)存分配。
-
虛擬機(jī)棧(Java Virtual Machine Stack):
- 虛擬機(jī)棧是 Java 虛擬機(jī)在執(zhí)行 Java 程序時(shí)使用的內(nèi)存區(qū)域之一,與線程生命周期相同。
- 每個(gè)線程在創(chuàng)建時(shí)都會(huì)分配一個(gè)對(duì)應(yīng)的虛擬機(jī)棧,用于存儲(chǔ)方法的調(diào)用棧幀(Stack Frame)、局部變量表、操作數(shù)棧等信息。
- 虛擬機(jī)棧中的棧幀存儲(chǔ)了方法的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu),每個(gè)方法的調(diào)用都會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)的棧幀。
-
棧幀(Stack Frame):
- 棧幀是虛擬機(jī)棧中的一個(gè)重要概念,用于表示方法在虛擬機(jī)中的運(yùn)行狀態(tài)和執(zhí)行信息。
- 每個(gè)方法的調(diào)用都會(huì)對(duì)應(yīng)一個(gè)棧幀,包含局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、返回地址等部分。
- 當(dāng)方法被調(diào)用時(shí),會(huì)創(chuàng)建一個(gè)新的棧幀壓入虛擬機(jī)棧,并在方法執(zhí)行完畢后彈出棧幀,恢復(fù)上一個(gè)調(diào)用棧幀的執(zhí)行。
區(qū)別總結(jié):
- 棧?是一種數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)和管理數(shù)據(jù),具有后進(jìn)先出的特性。
- 虛擬機(jī)棧?是 Java 虛擬機(jī)提供的內(nèi)存區(qū)域,用于存儲(chǔ)線程的方法調(diào)用棧幀和相關(guān)數(shù)據(jù)。
- 棧幀?是虛擬機(jī)棧中的一個(gè)部分,用于表示方法的運(yùn)行狀態(tài)和執(zhí)行信息,包含局部變量表、操作數(shù)棧等。
??二.隊(duì)列 Queue
???1.概念
????????在 Java 中,隊(duì)列(Queue)是一種先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)元素。隊(duì)列在 java.util
包中有多種實(shí)現(xiàn),如 LinkedList
、ArrayDeque
和 PriorityQueue
。只允許在一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊(duì)列具有先進(jìn)先出FIFO(First In First Out) 入隊(duì)列:進(jìn)行插入操作的一端稱(chēng)為隊(duì)尾(Tail/Rear) 出隊(duì)列:進(jìn)行刪除操作的一端稱(chēng)為隊(duì)頭(Head/Front)
??2.基本操作
方法
|
功能 |
boolean offer(E e) | 入隊(duì)列 |
E poll() | 出隊(duì)列 |
peek() | 獲取隊(duì)頭元素 |
int size() | 獲取隊(duì)列中有效元素個(gè)數(shù) |
boolean isEmpty() | 檢測(cè)隊(duì)列是否為空 |
注意:Queue是個(gè)接口,在實(shí)例化時(shí)必須實(shí)例化LinkedList的對(duì)象,因?yàn)?/span>LinkedList實(shí)現(xiàn)了Queue接口。
public static void main(String[] args) {
Queue<Integer> q = new LinkedList<>();
q.offer(1);
q.offer(2);
q.offer(3);
q.offer(4);
q.offer(5); // 從隊(duì)尾入隊(duì)列
System.out.println(q.size());
System.out.println(q.peek()); // 獲取隊(duì)頭元素
q.poll();
System.out.println(q.poll()); // 從隊(duì)頭出隊(duì)列,并將刪除的元素返回
if(q.isEmpty()){
System.out.println("隊(duì)列空");
}else{
System.out.println(q.size());
}
}
這個(gè)示例展示了隊(duì)列的基本操作,包括入隊(duì)、出隊(duì)、查看隊(duì)頭元素和判空。隊(duì)列在 Java 中常用于實(shí)現(xiàn)任務(wù)調(diào)度、消息傳遞等場(chǎng)景,能夠有效管理元素的順序和執(zhí)行順序。
??三.總結(jié)與反思
??人類(lèi)也需要夢(mèng)想者,這種人醉心于一種事業(yè)的大公無(wú)私的發(fā)展,因而不能注意自身的物質(zhì)利益?!永锓蛉?/p>
? ? ? ? 在學(xué)習(xí) Java 中的棧(Stack)和隊(duì)列(Queue)這兩種經(jīng)典數(shù)據(jù)結(jié)構(gòu)時(shí),我深刻體會(huì)到它們的重要性和應(yīng)用廣泛性。通過(guò)掌握棧和隊(duì)列的基本操作,如入棧、出棧、入隊(duì)、出隊(duì),我加深了對(duì)數(shù)據(jù)結(jié)構(gòu)的理解。
????????在實(shí)踐中,我意識(shí)到需要關(guān)注空間復(fù)雜度和時(shí)間復(fù)雜度的問(wèn)題,尤其在處理大規(guī)模數(shù)據(jù)集時(shí)。異常處理也是學(xué)習(xí)中的重要環(huán)節(jié),確保程序能夠正常處理各種邊界情況。了解棧和隊(duì)列在算法和程序設(shè)計(jì)中的應(yīng)用場(chǎng)景,如表達(dá)式求值、任務(wù)調(diào)度等,為我提供了有效的工具。通過(guò)深入研究 Java 中不同的棧和隊(duì)列實(shí)現(xiàn)類(lèi),我學(xué)習(xí)了它們的特性和使用方法。
????????我希望進(jìn)一步應(yīng)用所學(xué)知識(shí),深入探索棧和隊(duì)列在更復(fù)雜算法和數(shù)據(jù)結(jié)構(gòu)中的應(yīng)用,提升自己的編程能力。通過(guò)不斷練習(xí)和實(shí)踐,我相信能夠更熟練地運(yùn)用棧和隊(duì)列,解決實(shí)際問(wèn)題,并在日常開(kāi)發(fā)中發(fā)揮它們的作用。我的學(xué)習(xí)之路將持續(xù)前行,為未來(lái)的軟件開(kāi)發(fā)工作做好準(zhǔn)備。
????????????????????????????????????????????????????????
以上,就是本期的全部?jī)?nèi)容啦,若有錯(cuò)誤疏忽希望各位大佬及時(shí)指出??
? 制作不易,希望能對(duì)各位提供微小的幫助,可否留下你免費(fèi)的贊呢??文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-859619.html
?
到了這里,關(guān)于Java 【數(shù)據(jù)結(jié)構(gòu)】 棧(Stack)和隊(duì)列(Queue)【神裝】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!