玩家反映《仙劍7》開光追爆視訊記憶體 官方:玄學 暫時無解
阿新 • • 發佈:2021-11-09
供自己鞏固集合知識時寫的筆記,不會對所有的內容都介紹
棧(Stack)是一種後進先出(LIFO:Last In First Out)的資料結構
Stack
只有入棧和出棧的操作:
- 把元素壓棧:
push(E)
; - 把棧頂的元素“彈出”:
pop()
; - 取棧頂元素但不彈出:
peek()
。
有的人在使用Stack
時會發現,Stack
沒有單獨的介面。因為有個遺留類名字就叫Stack
,出於相容性考慮,所以沒辦法建立Stack
介面。
Stack的作用
Stack在計算機中使用非常廣泛,JVM在處理Java方法呼叫的時候就會通過棧這種資料結構維護方法呼叫的層次。例如:
static void main(String[] args) { foo(123); } static String foo(x) { return "F-" + bar(x + 1); } static int bar(int x) { return x << 2; }
JVM會建立方法呼叫棧,每呼叫一個方法時,先將引數壓棧,然後執行對應的方法;當方法返回時,返回值壓棧,呼叫方法通過出棧操作獲得方法返回值。
因為方法呼叫棧有容量限制,巢狀呼叫過多會造成棧溢位,即引發StackOverflowError
:
public class Main {
public static void main(String[] args) {
increase(1);
}
static int increase(int x) {
return increase(x) + 1;
}
}
我們再來看一個Stack
的用途:對整數進行進位制的轉換就可以利用棧。
例如,我們要把一個int
整數12500
轉換為十六進位制表示的字串:
先我們準備一個空棧:
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
└───┘
然後計算12500÷16=781…4,餘數是4
,把餘數4
壓棧:
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ 4 │
└───┘
然後計算781÷16=48…13,餘數是13
,13
的十六進位制用字母D
表示,把餘數D
壓棧:
│ │
│ │
│ │
│ │
│ │
│ D │
│ │
│ 4 │
└───┘
然後計算48÷16=3…0,餘數是0
0
壓棧:
│ │
│ │
│ │
│ 0 │
│ │
│ D │
│ │
│ 4 │
└───┘
最後計算3÷16=0…3,餘數是3
,把餘數3
壓棧:
│ │
│ 3 │
│ │
│ 0 │
│ │
│ D │
│ │
│ 4 │
└───┘
當商是0
的時候,計算結束,我們把棧的所有元素依次彈出,組成字串30D4
,這就是十進位制整數12500
的十六進位制表示的字串。