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