1. 程式人生 > 遊戲 >玩家反映《仙劍7》開光追爆視訊記憶體 官方:玄學 暫時無解

玩家反映《仙劍7》開光追爆視訊記憶體 官方:玄學 暫時無解

供自己鞏固集合知識時寫的筆記,不會對所有的內容都介紹

棧(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,餘數是1313的十六進位制用字母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的十六進位制表示的字串。