堆疊與佇列
- 葉子齊 -
ZSISC 31x32
楓資群
IZCC 115x116
IZCC四校群
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
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()
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() | 內有幾個元素 |
|---|
Stack
Queue
queueData
stackData
1
2
回傳 1
回傳 0
stackData.empty()
queueData.empty()
Stack
Queue
queueData
stackData
1
2
回傳 0
回傳 2
stackData.size()
queueData.size()
題目說明:
請利用迴圈
在stack裡按順序放入1~9
並輸出最頂端的三個
(輸出後要將最頂端的元素刪除)
再將此時stack內有幾個元素輸出
測試輸入:
無輸入
測試輸出:
9
8
7
6個元素
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裡按順序放入1~9
並輸出最前方的三個
(輸出後要將最前方的元素刪除)
再將此時queue內有幾個元素輸出
測試輸入:
無輸入
測試輸出:
1
2
3
6個元素
#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);#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;
}#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;
}#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;
}#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;
}