基本介紹
- 棧是一個先入后出的有序列表。
- 棧是限制線性表中元素的插入和刪除只能在線性表的同一端進行的一種特殊線性表。允許插入和刪除的一端,為變化的一段,稱為棧頂,另一端為固定的一端,稱為棧底。
- 根據棧的定義可知,最先放入棧中的元素在棧底,最后放入的元素在棧頂,而刪除元素剛好相反,最后放入的元素最先刪除,最先放入的元素最后刪除。
- 圖解

應用場景
- 子程序的調用:在跳往子程序前,會先將下個指令的內存地址存到堆棧中,直到子程序執行完后再將地址取出,以回到原來的程序中。
- 處理遞歸調用:和子程序的調用類似,只是除了儲存下一個指令的地址外,也將參數、區域變量等數據存入堆棧中。
- 表達式的轉換【中綴表達式轉后綴表達式】與求值。
- 二叉樹的遍歷。
- 圖的深度優先搜索法。
使用鏈表實現棧
- 節點類
package com.stack;
public class Node {
private Object data;
private Node next;
public Node() {
}
public Node(Object data) {
this.data = data;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
@Override
public String toString() {
return "Node{" +
"data=" + data +
'}';
}
}
- 棧的實現類
package com.stack;
public class LinkedListStack {
private Node head = new Node();
private int maxSize;
public LinkedListStack(int maxSize) {
this.maxSize = maxSize;
}
public boolean isFull(){
Node temp = head.getNext();
int total = 0;
while(temp != null){
total++;
temp = temp.getNext();
}
return total == maxSize;
}
public boolean isEmpty(){
return head.getNext() == null;
}
public void push(Node node){
if(isFull()){
throw new RuntimeException("棧滿!");
}
Node temp = head;
Node cur = head;
//避免重復數據入棧
while(true){
if(cur.getNext() == null){
break;
}
if(cur.getNext() == node){
throw new RuntimeException("數據重復入棧!");
}
cur = cur.getNext();
}
node.setNext(temp.getNext());
temp.setNext(node);
}
public void pop(){
if(isEmpty()){
throw new RuntimeException("棧空!");
}
Node temp = head;
temp.setNext(temp.getNext().getNext());
}
public void list(){
if(head.getNext() == null){
System.out.println("棧空!");
return;
}
Node temp = head.getNext();
while(temp != null){
System.out.println(temp);
temp = temp.getNext();
}
}
}