stack & queue

堆疊與佇列

- 葉子齊 -

考幹表單!

聯課報名

  • 3/9、3/15、3/16
  • 學術性活動
  • 和ruby、SCINT(北臺灣學生資訊社群)合作

放課調查

  • 表單非報名表,而是協助決定每個課程星期幾開課
  • 機器學習 - INFOR37翁浩洋
  • 伺服器維運 - CKCSC37謝恩
  • R語言 - ZSISC31蔡其霏
  • 演算法 - INFOR37溫世揚 CKCSC37蔡孟平
  • Flask - CKCSC37郭昶佑

群組連結

ZSISC 31x32

楓資群

IZCC 115x116

IZCC四校群

who am i

  • 姓名:葉子齊
  • 職位:副社長兼教學兼美宣
  • 綽號:葉子
  • 堆疊
  • 資料結構
  • 後進先出(Last In First Out)
  • 需引入函式庫<stack>
  • 佇列
  • 資料結構
  • 先進先出(First In First Out)
  • 需引入函式庫<queue>

Stack

Queue

疊盤子

排隊

  • 應用情境
    • 函數呼叫堆疊:在程式執行中管理函數呼叫順序(遞迴尤其依賴堆疊)

    • 括號匹配:檢查程式中的括號是否正確匹配(如括號、括弧、引號等)

    • 瀏覽器回退功能:儲存使用者的瀏覽歷史

    • 深度優先走訪

  • 應用情境
    • 排隊系統:例如印表機工作列、排隊叫號系統

    • 作業系統排程:用來處理作業排程和資源管理

    • 網路數據緩存:如封包排隊等待處理

    • 廣度優先走訪

Stack(堆疊)

Queue(佇列)

Stack Queue
push(元素) push(元素) 放入元素
pop() pop() 刪除第一個元素
top() front() 讀取最上面/最前面的元素
empty() empty() 是否為空
size() size() 內有幾個元素

基本操作​

stack <型態> 名稱 queue <型態> 名稱 宣告

宣告

stack <int> stackData;

Stack

Queue

queue <int> queueData;

queueData

stackData

push

Stack

Queue

queueData

stackData

stackData.push(1)

1

1

2

stackData.push(2)

2

2

3

stackData.push(3)

3

-> stackData.top()

queueData.push(1)

1

1

2

2

queueData.push(2) 

3

queueData.push(3) 

3

 queueData.front()

->

-> stackData.top()

pop

Stack

Queue

queueData

stackData

1

2

3

1

2

3

stackData.pop()

stackData.pop()

stackData.pop()

queueData.pop() 

2

3

queueData.pop() 

2

3

queueData.pop() 

基本操作​

empty() 是否為空
回傳1 空的
回傳0 內含元素(不是空的)
size() 內有幾個元素

empty

Stack

Queue

queueData

stackData

1

2

回傳 1

回傳 0

stackData.empty()

queueData.empty()

size

Stack

Queue

queueData

stackData

1

2

回傳 0

回傳 2

stackData.size()

queueData.size()

小示範 - Stack

題目說明:

請利用迴圈

在stack裡按順序放入1~9

並輸出最頂端的三個

(輸出後要將最頂端的元素刪除)

再將此時stack內有幾個元素輸出

測試輸入:

無輸入

測試輸出:

9

8

7

6個元素

小示範 - Stack

s

#include <iostream>
#include <stack>

using namespace std;
int main(){

    stack <int> s;
    for(int i=1;i<10;i++){
        s.push(i);
    }
    for(int i=0;i<3;i++){
        cout<<s.top()<<endl;
        s.pop();
    }
    cout<<s.size()<<"個元素"<<endl;
    return 0;
}
9
8
7
6
5
4
3
2
1

-> s.top()

小示範 - queue

題目說明:

請利用迴圈

在queue裡按順序放入1~9

並輸出最前方的三個

(輸出後要將最前方的元素刪除)

再將此時queue內有幾個元素輸出

測試輸入:

無輸入

測試輸出:

1

2

3

6個元素

小示範 - queue

#include <iostream>
#include <queue>

using namespace std;
int main(){

    queue <int> q;
    for(int i=1;i<10;i++){
        q.push(i);
    }
    for(int i=0;i<3;i++){
        cout<<q.front()<<endl;
        q.pop();
    }
    cout<<q.size()<<"個元素"<<endl;
    return 0;
}
9 8 7 6 5 4 3 2 1

q.front()

->

實作

- pq邂逅 -

實作

加速code

ios_base::sync_with_stdio(0);
cin.tie(0);
  • 打在int main()大括號裡
  • 不能和while一起使用

實作

#include <iostream>
#include <stack>
using namespace std;
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    stack <char> stackData;
    int n, sum;
    string pqData;
    cin >> n;
   
    for(int i=0 ; i<n ; i++){
        
        cin >> pqData;
        for(int j=0 ; j<pqData.length() ; j++){
            
            if(pqData[j] == 'p'){
                
                stackData.push(pqData[j]);
            
            }
            else if(pqData[j] == 'q' && !stackData.empty() ){
                
                sum = sum + 1;
                stackData.pop();
                
            }
            
        }
        
        cout << sum << endl;
        sum = 0;
        
        while(stackData.size() > 0){
            stackData.pop();
        }
        
    }
    

    return 0;
}

kahoot!

Index

#include <iostream>
#include <stack>
using namespace std;
int main()
{
    stack <int> s;
    for (int i=0 ; i<5; i++ ) {
        s.push(i);
    }
    while (!s.empty()) {
        cout << s.top() << " ";
        s.pop();
    }
    
    return 0;
}

Index

#include <iostream>
#include <stack>
#include <queue>
using namespace std;
int main()
{
    stack <int> s;
    string word;
    cin>>word;
    
    for (int i=0; i<word.length(); i++) {
        if( word[i] == 'Z')
            continue;
        s.push(i);
    }
    queue <int> q;
    int times = s.size();
    for(int j=0 ; j<times ; j++){
        q.push(s.top());
        s.pop();
    }
    q.pop();
    while(!q.empty()){
        cout<<q.front()<<" ";
        q.pop();
    }
    return 0;
}

Index

#include <iostream>
#include <stack>
using namespace std;

int main()
{
    stack <int> s;
    string word;cin>>word;
    
    for(int i=0 ; i<word.length() ; i++){
        if(word[i] == '0')
            s.push(0);
        else if(word[i] == '1')
            s.push(1);
        else if(word[i] == '2')
            s.push(s.top());
    }
    int times = s.size();
    for(int j=0 ; j<times ; j++){
        cout<<s.top()<<" ";
        s.pop();
    }
    return 0;
}

stack & queue

By strange_swing

stack & queue

  • 295