劍指offer-22:棧的壓入彈出序列
阿新 • • 發佈:2019-01-03
輸入兩個整數序列,第一個表示壓棧順序,判斷第二個序列是否為該棧的彈出序列?
分析:
- 此題解法就是人判斷時的做法。想想人工判斷時的步驟,先設一個輔助棧。
- 大迴圈:彈出序列完成
- 初始棧為空,按照壓棧順序壓入。當棧頂元素不等於彈出序列頂時,繼續壓棧。直至壓棧順序壓完,或者當前棧頂和彈出序列頂相同
- 出小迴圈,判斷哪種情況出來的。如果棧頂和彈出序列頂不同,說明沒等到,跳出大迴圈。否則屬於遇到相等的,則棧頂彈出。彈出序列頂++
- 最終判斷:棧空且彈出序列完成。
程式碼:
#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;
}