完整題目是這樣的:給我們兩個序列,第一個序列表示棧的壓入順序,然後讓判斷第二個序列是不是是否是該棧的彈出序列。現設第一個序列為[1,2,3,4,5],第二個序列為[3,2,5,4,1],可以看出這個出棧順序是合法的,那麼我們怎麼通過程序來驗證呢?
既然是判斷棧的出棧順序,那麼我們肯定得有一個輔助棧,來幫助我們做這樣的題。我們把第一個序列中的數字一次壓入棧中,壓入的過程中按照第二個序列的順序依次從棧中彈出數字。
我采用的是用vector來存放兩個序列,判斷當棧為空或者棧頂元素和V2[i]不相等,就繼續壓棧。第一次1壓入棧,一直滿足上面說的壓棧條件,所以壓入了1,2,3,此時棧頂的3和V2第一個元素相等,則進行出棧操作,i++即下次比較V2的下一個元素。
這個循環的操作,重要的是判斷結束的條件。
下面是代碼:
1 #include<stack> 2 bool CheckOutStackOrder(const vector<int>& v1, const vector<int>& v2) 3 { 4 if (v1.size() != v2.size() ) 5 return false; 6 stack<int> s; 7 size_t idex1 = 0, idex2 = 0; 8 while (idex2 < v2.size()) 9 { 10 while (s.empty() || s.top()!=v2[idex2]) 11 { 12 if (idex1 < v1.size()) 13 { 14 s.push(v1[idex1++]); 15 } 16 else 17 return false; 18 } 19 idex2++; 20 s.pop(); 21 } 22 return true; 23 } 24 void funtest() 25 { 26 vector<int> v1; 27 vector<int> v2; 28 v1.push_back(1); 29 v1.push_back(2); 30 v1.push_back(3); 31 v1.push_back(4); 32 v1.push_back(5); 33 34 v2.push_back(3); 35 v2.push_back(2); 36 v2.push_back(5); 37 v2.push_back(4); 38 v2.push_back(1); 39 bool a = CheckOutStackOrder(v1, v2); 40 }