1. 程式人生 > >劍指offer-22:棧的壓入彈出序列

劍指offer-22:棧的壓入彈出序列

輸入兩個整數序列,第一個表示壓棧順序,判斷第二個序列是否為該棧的彈出序列?

分析

  • 此題解法就是人判斷時的做法。想想人工判斷時的步驟,先設一個輔助棧。
  • 大迴圈:彈出序列完成
  • 初始棧為空,按照壓棧順序壓入。當棧頂元素不等於彈出序列頂時,繼續壓棧。直至壓棧順序壓完,或者當前棧頂和彈出序列頂相同
  • 出小迴圈,判斷哪種情況出來的。如果棧頂和彈出序列頂不同,說明沒等到,跳出大迴圈。否則屬於遇到相等的,則棧頂彈出。彈出序列頂++
  • 最終判斷:棧空且彈出序列完成。

程式碼:

#include <iostream>
#include <vector>
#include <stack>
using namespace std; class Solution { public: bool IsPopOrder(vector<int> pushV,vector<int> popV) { bool res = false; vector<int>::iterator pnextpush = pushV.begin(); vector<int>::iterator pnextpop = popV.begin(); stack<int> s; // 當彈出序列沒完時
while(pnextpop != popV.end()) { // 初始棧空或棧頂不是彈出序列頂時,壓棧 while(s.empty() || s.top() != *pnextpop) { // 壓棧序列完了,跳出 if(pnextpush == pushV.end()) break; s.push(*pnextpush); pnextpush++; } // 棧頂不等於彈出序列頂,則跳出
if(s.top() != *pnextpop) break; // 彈棧,第一個序列匹配 s.pop(); pnextpop++; } // 彈出序列彈完,且棧為空,說明匹配 if(s.empty() && pnextpop==popV.end()) res = true; return res; } }; // 測試 int _tmain(int argc, _TCHAR* argv[]) { int i,tmp; vector<int> push; vector<int> pop; for(i=0;i<5;++i) { cin >> tmp; push.push_back(tmp); } for(i=0;i<5;++i) { cin >> tmp; pop.push_back(tmp); } Solution s; cout << s.IsPopOrder(push, pop) << endl; return 0; }