先貼臉來個圖
這是一個解析圖,總體是個棧(stacks)細分有數組和鏈表【注意這兒的linkedlist可不是Java集合List中的linklist】
對于棧,如果我們想向棧中添加元素,或者想從中刪除元素,都必須從一個地方開始:棧的頂部(Top)。這種從同一位置插入和刪除的行為也叫后進后先(Last In, First Out,LIFO)
圖示
LIFO圖例備份
棧的實現方式
一句話,棧用鏈表實現就是上面提到的linkedList。
鏈表有一個顯著的特征,任何操作都在一個頭節點上,這樣一來復雜的就是O(1),這樣得益于LIFO。
到這如果感覺啰嗦,可以跳到最后的實現,有完整簡易Java代碼的實現,現在gpt這么好用,其他語言的也可以拿到Java代碼轉置一下,變成自己喜歡的高級語言debugger
當然, 棧也開業用數組實現,但是數組數組是靜態數據結構,比如我們在Java中生命一個數組甚至要聲明出其可存儲的數據類型
//int [一個數字預設存儲空間] = ****
int[8] = ***;
雖然使用鏈表不用這樣設置和聲明,這樣會讓鏈表以后他可以一直裝,這種時候就會遇到棧溢出
的問題,但是只要不是你的這個類型的數據徹底占用了你的電腦內存就不會發生,而且人家鏈表里面是多個數組根本不擔心你過來的是什么,來了就往口袋里裝(回到圖一??)。
棧操作
以增刪為例
我們只能從棧的一端(頂部)添加和刪除元素,無論使用哪種語言實現棧,幾乎都會實現以下幾個基本的操作:
push:用于將元素添加到棧頂
pop:用于從棧頂刪除元素
top ( peek ):返回棧頂部的元素,但不會將其刪除
isEmpty:檢查棧是否為空
size:返回棧中的元素數量
棧的實現
偽代碼示例及代碼實現
一個函數(function_one),它定義了一些局部變量,然后將這些變量作為參數調用了函數function_two,function_two中做了類似的事情:定義了一些局部變量,然后將這些變量作為參數傳遞給另一個函數(function_three)。
使用Java
class Node {int data;Node next;Node(int data) {this.data = data;this.next = null;}
}//用鏈表實現棧
class LinkedStack {//始終指向棧頂節點(鏈表頭結點)private Node top;private int size;public LinkedStack() {this.top = null;this.size = 0;}// 壓入棧頂public void push(int data) {Node newNode = new Node(data);newNode.next = top;top = newNode;size++;}// 彈出棧頂public int pop() {if (isEmpty()) {throw new RuntimeException("Stack is empty. Cannot pop.");}int data = top.data;top = top.next;size--;return data;}// 獲取棧頂元素public int top() {if (isEmpty()) {throw new RuntimeException("Stack is empty. Cannot retrieve top element.");}return top.data;}// 檢查棧是否為空public boolean isEmpty() {return top == null;}// 獲取棧的大小public int size() {return size;}// 打印棧public void printStack() {Node current = top;while (current != null) {System.out.print(current.data + " -> ");current = current.next;}System.out.println("null");}
}public class StackExample {public static void main(String[] args) {LinkedStack stack = new LinkedStack();// 壓入棧頂stack.push(1);stack.push(2);stack.push(3);stack.printStack(); // 輸出: 3 -> 2 -> 1 -> null// 獲取棧頂元素System.out.println("Top element is: " + stack.top()); // 輸出: 3// 彈出棧頂System.out.println("Popped element is: " + stack.pop()); // 輸出: 3stack.printStack(); // 輸出: 2 -> 1 -> null// 獲取棧大小System.out.println("Stack size is: " + stack.size()); // 輸出: 2// 檢查棧是否為空System.out.println("Is stack empty? " + stack.isEmpty()); // 輸出: false// 彈出所有元素stack.pop();stack.pop();stack.printStack(); // 輸出: null// 檢查棧是否為空System.out.println("Is stack empty? " + stack.isEmpty()); // 輸出: true}
}