演算法入門 6.1.2 鐵軌
阿新 • • 發佈:2019-01-31
重點:stack和queue
1.先檢查兩個佇列頭是否相等,若不等,檢查出佇列頭和棧頭是否相等,若不等,檢查入佇列是否為空,若非空入棧,否則跳出迴圈
2.每次訪問入佇列和棧首元素時,注意其是否存在;
實現程式碼:
#include <iostream> #include <queue> #include <stack> #include <stdio.h> using namespace std; int main() { int n; freopen("test.in","r",stdin); while(cin >> n){ queue<int> in; queue<int> out; for(int i=0 ; i<n ;i++){ int temp; cin >> temp; out.push(temp); in.push(i+1); } stack<int> fac; while(out.size() != 0){ if(in.size()!= 0 && in.front() == out.front()){ out.pop(); in.pop(); } else if(fac.size()!=0 && fac.top()==out.front()){ fac.pop(); out.pop(); } else if(in.size()!=0){ fac.push(in.front()); in.pop(); } else{ break; } } // fac.push(in.front()); // in.pop(); // while(out.size() != 0){ //// cout << out.front() << " " <<fac.top()<< endl; // while(out.front()!=fac.top()){ // // fac.push(in.front()); // in.pop(); // } // if(out.front() == fac.top()){ // fac.pop(); // out.pop(); // if(fac.size() == 0){ // if(in.size() == 0){ // break; // } // fac.push(in.front()); // in.pop(); // } // } // else{ // break; // } // //// cout << out.front() << " " <<fac.top()<< endl; // // } if(out.size() == 0){ cout << "Yes" << endl; } else{ cout << "No" << endl; } } return 0; }
註釋部分為最開始時寫的程式碼,每次先入棧再匹配,相對來說麻煩,中間有的地方沒檢查佇列和棧是否為空。