瀏覽器上一頁模擬
L2|進階M1-11-04看題目內容
- 輸入
- M、M個指令代碼、M個數字
- 輸出
- 目前所在頁面代碼,若無則輸出0
輸入
4 1 1 1 2 100 200 300 0
200
模擬堆疊和佇列的放入、取出,並用在生活情境
資料放進去、拿出來的順序,會決定程式的行為。最常見的兩種規則:
| 堆疊(Stack) | 佇列(Queue) | |
|---|---|---|
| 生活例子 | 一疊盤子、瀏覽器的上一頁 | 排隊買東西、叫號系統 |
| 規則 | 後進先出:最後放上去的最先拿走 | 先進先出:最先來的最先服務 |
| 放入 | 放在清單最後 | 放在清單最後 |
| 拿出 | 拿走清單最後一筆 | 拿走清單第一筆 |
| 你想做的事 | Blockly | Scratch |
|---|---|---|
| 放入 | 自清單 堆疊 添加 最後一筆 為(數字) | 添加(數字)到 堆疊 |
| 堆疊拿出 | 自清單 堆疊 移除 最後一筆 | 刪除 堆疊 的第(清單 堆疊 的長度)項 |
| 佇列拿出 | 自清單 佇列 移除 第一筆 | 刪除 佇列 的第 1 項 |
| 是不是空的 | 長度 堆疊 = 0 | 清單 堆疊 的長度 = 0 |
堆疊或佇列已經空了還要拿資料,程式可能會出錯。題目通常會說「如果是空的就跳過」,所以拿之前要先判斷「長度 > 0」。
先讀題,再一步一步點開來看。建議每看完一步,就先自己在平台上試著寫寫看。
5 1 1 2 1 2 10 20 0 30 0
10
第 i 個指令要搭配第 i 個數字,所以先把兩行分別讀進「指令清單」和「數字清單」(K18 的平行清單):
詢問並等待 → M 重複 M 次:讀入 指令,添加到 指令清單 重複 M 次:讀入 數值,添加到 數字清單
堆疊 設為 空清單
i 從 1 數到 M:
如果 指令清單 的第 i 項 = 1:
把 數字清單 的第 i 項 添加到 堆疊 最後
否則:
如果 堆疊 的長度 > 0:
移除 堆疊 的最後一筆
如果 堆疊 的長度 = 0:說出 空
否則:依序說出 堆疊 的每一項指令「1 1 2 1 2」、數字「10 20 0 30 0」:
| i | 指令 | 動作 | 堆疊 |
|---|---|---|---|
| 1 | 1 | 放入 10 | 10 |
| 2 | 1 | 放入 20 | 10 20 |
| 3 | 2 | 拿走最後的 20 | 10 |
| 4 | 1 | 放入 30 | 10 30 |
| 5 | 2 | 拿走最後的 30 | 10 |
輸出「10」。
按「載入範例」,看看「移除」外面有一層「如果不是空的」的判斷。
5 1 1 2 1 2 10 20 0 30 0
30
輸入格式和上一題完全一樣,程式也幾乎一樣,只差拿出的位置:佇列要拿走第一筆(最早進來的)。
否則:
如果 佇列 的長度 > 0:
移除 佇列 的第一筆同樣的指令「1 1 2 1 2」、數字「10 20 0 30 0」:
| i | 指令 | 動作 | 佇列 |
|---|---|---|---|
| 1 | 1 | 放入 10 | 10 |
| 2 | 1 | 放入 20 | 10 20 |
| 3 | 2 | 拿走最前面的 10 | 20 |
| 4 | 1 | 放入 30 | 20 30 |
| 5 | 2 | 拿走最前面的 20 | 30 |
輸出「30」。同一組指令,堆疊剩 10、佇列剩 30,這就是兩種規則的差別。
照順序完成這些題目。寫完之後,可以在平台上按「載入範例」和自己的寫法比較。
4 1 1 1 2 100 200 300 0
200
4 1 1 1 2 101 102 103 0
102 103
核心題都會了嗎?這些題目需要把好幾個技巧組合起來,想挑戰的話可以試試看。
(())
合法
(()
不合法
學完之後,檢查看看你能不能做到這些事。有做不到的,就回到上面對應的地方再看一次。