---
# System prepended metadata

title: Data Structure - Stack

---

# Data Structure - Stack

## 用途

程式設計hw1第三題會用到。

## 概念
有人將stack比喻為一疊盤子。

push()代表把一個新的盤子放到堆的頂端，pop()則是將堆頂端的盤子移除，top()會取得堆頂端的盤子，is_empty()會判斷堆中還有沒有盤子，以下以盤子的概念說明。

1. 一開始沒有任何盤子。
| ___ |

2. ```push(3)```
```push(2)```
```push(1)```
| _ 1 _ |
| _ 2 _ |
| _ 3 _ |

相當於：
放了3這個盤子進去。
放了2這個盤子進去。
放了1這個盤子進去。

3. ```top()```
| _ 1 _ |
| _ 2 _ |
| _ 3 _ |

後放進去的盤子會在頂端，所以會得到1。

4. ```pop()```
| _ 2 _ |
| _ 3 _ |

移除頂端的盤子，所以1被拿走了。

5. ```push(4)```
| _ 4 _ |
| _ 2 _ |
| _ 3 _ |


再放4這個盤子進去。

6. ```top()```
| _ 4 _ |
| _ 2 _ |
| _ 3 _ |

會得到4。





## 實作

### 實作細節
stack可以用linked-list或array的方法來實作，方便起見，我使用array實作，需要有四種函式來操作stack，分別為：

- ```is_empty()```:判斷stack是否為空
- ```top()```:回傳stack頂端的值
- ```push()```:將資料放入到頂端
- ```pop()```:移除stack頂端的值

```stack[0]```代表stack的長度。
1. 一開始stack：

| 0  | 1  | 2  | 3  | 4  | 5  |
| ---| ---| ---| ---| ---| ---|
| 0  | 0  | 0  | 0  | 0  | 0  |



2. ```push(3)```
```push(2)```
```push(1)```

| 0  | 1  | 2  | 3  | 4  | 5  |
| ---| ---| ---| ---| ---| ---|
| 3  | 3  | 2  | 1  | 0  | 0  |



3. ```top()```

| 0  | 1  | 2  | 3  | 4  | 5  |
| ---| ---| ---| ---| ---| ---|
| 3  | 3  | 2  | 1  | 0  | 0  |

會回傳1。

4. ```pop()```

| 0  | 1  | 2  | 3  | 4  | 5  |
| ---| ---| ---| ---| ---| ---|
| 2  | 3  | 2  | 0  | 0  | 0  |

5. ```push(4)```

| 0  | 1  | 2  | 3  | 4  | 5  |
| ---| ---| ---| ---| ---| ---|
| 3  | 3  | 2  | 4  | 0  | 0  |

6.```top()```

| 0  | 1  | 2  | 3  | 4  | 5  |
| ---| ---| ---| ---| ---| ---|
| 3  | 3  | 2  | 4  | 0  | 0  |

會回傳4。

### 程式碼
```c=
int is_empty(int *stack){
    return stack[0] == 0;   
}
```
```stack[0]```代表stack的長度，如果為0代表stack是空的。

```c=
int top(int *stack){
    if(is_empty(stack)) return -MAX;            
    return stack[stack[0]];
}
```
```stack[0]```代表stack的長度，所以```stack[stack[0]]```是stack的頂端。
```c=
void push(int *stack , int n){ 
    stack[0]++;
    stack[stack[0]] = n;
}
```
```push()```將n放入stack頂端。
```push()```前，```stack[stack[0]]```是原本stack的頂端。
```stack[0]++```後，```stack[stack[0]]```是後來stack的頂端。



```c=
void pop(int *stack){
    if(is_empty(stack)) return;         
    stack[0]--;
}
```

```pop()```前，```stack[stack[0]]```是原本stack的頂端。
```stack[0]--```後，```stack[stack[0]]```是後來stack的頂端。

## 總結
1. stack是一種單向的資料結構，加入資料，移除資料都是在同一邊操作，後進去的資料會先出來。
2. ```stack[0]```代表長度。
3. 每執行一次```push()```，```stack[0]++```；每執行一次```pop()```，```stack[0]--```。
4. 需要四種函式操作stack
- ```is_empty()```:判斷stack是否為空
- ```top()```:回傳stack頂端的值
- ```push()```:將資料放入到頂端
- ```pop()```:移除stack頂端的值
5. 程設的第三題會用到stack。

