題目描述:輸入兩個整數序列。其中一個序列表示棧的push順序,判斷另一個序列有沒有可能是對應的pop順序。爲了簡單起見,我們假設push序列的任意兩個整數都是不相等的。比如輸入的push序列是1、2、3、4、5、6、7,那麼2、1、4、3、7、6、5就有可能是一個pop系列。但序列4、3、5、1、2、7、6就不可能是push序列1、2、3、4、5的pop序列。
問題分析:解決這個問題我們可以申請一個棧,然後從輸入序列開頭一個一個判斷是否等於輸出序列的頭。舉個簡單的例子。比如輸入序列爲1、2、3、4輸出序列爲3、4、2、1,這是輸出序列第一個數字爲3,我們就從輸入序列開始尋找3,直到找到3,而假如3之前有數據我們就把它們存入棧中,在輸入序列中,開始碰到的是1元素,和輸出序列的第一個元素不相等,我們就把1放入棧中,然後就是2元素,也不想等,也放入棧中,然後就是3,這時候和輸出序列的第一個元素相等,我們就把輸出序列的下標移到2,而輸入序列的下標移到3,這時候輸出序列的元素爲4,先個棧頂元素比較,發現不相等,這時候元素要麼在輸入序列的後面,要麼就沒有,我們在輸入序列裏面尋找,此時的出入序列指到元素4正好和輸出序列的元素相等,於是我們把輸出序列和輸入序列的下標都加上1,此時輸入序列已經弄完了,而輸出序列指着2,我們也先和棧頂元素比較,發現它們相等,於是我們把棧頂元素刪除,同時輸出序列的下標加1,這時候輸出序列直到元素1,我們再和棧頂元素比較,發現它們相等,於是我們把棧頂元素刪除,同時輸出序列的下標加1。這時候我們發現棧爲空,而且輸入序列的下標已經直到輸入序列的末尾,這說明輸出序列是棧的輸出序列,我們返回true,否則我們返回false;代碼實現如下所示:
#include <iostream>
/*
* author: w397090770
* Email:[email protected]
* 僅用於學習交流之用
**/
#include <vector>
#include <stack>
using namespace std;
bool IsPopOrder(const vector<int> & Push, const vector<int> & Pop){
if(Push.size() != Pop.size()){
return false;
}
stack<int>temp;
int tempIndex = 0;
int tempIndex2 = 0;
int Size = Pop.size();
while(tempIndex2 < Size){
for(; tempIndex < Size; tempIndex++){
if(Push[tempIndex] == Pop[tempIndex2]){
tempIndex2++;
tempIndex++;
break;
}
temp.push(Push[tempIndex]);
}
if(!temp.empty() && temp.top() != Pop[tempIndex2]){
for(; tempIndex < Size; tempIndex++){
if(Push[tempIndex] == Pop[tempIndex2]){
tempIndex2++;
tempIndex++;
break;
}
temp.push(Push[tempIndex]);
}
}else if(!temp.empty()){
temp.pop();
tempIndex2++;
}
if(!temp.empty() && tempIndex >= Size && temp.top() != Pop[tempIndex2]){
return false;
}else{
while(!temp.empty() && temp.top() == Pop[tempIndex2]){
temp.pop();
tempIndex2++;
}
}
}
if(temp.empty() && tempIndex >= Size){
return true;
}
return false;
}
int main(){
vector<int> Push, Pop;
//1 1
//1 2
//1, 2, 3, 4, 5 3, 5, 4, 1, 2
//1, 2, 3, 4, 5 4, 3, 5, 1, 2
//1, 2, 3, 4, 5 3, 5, 4, 2, 1
//1, 2, 3, 4, 5 4, 5, 3, 2, 1
//1, 2, 3, 4, 5 3, 5, 4, 2, 1
Push.push_back(1);
Push.push_back(2);
Push.push_back(3);
Push.push_back(4);
Push.push_back(5);
Push.push_back(6);
Push.push_back(7);
Pop.push_back(2);
Pop.push_back(1);
Pop.push_back(4);
Pop.push_back(3);
Pop.push_back(7);
Pop.push_back(5);
Pop.push_back(6);
cout << IsPopOrder(Push, Pop) << endl;
return 0;
}
代碼是其次,這個思想不錯 學習下
轉自:http://blog.csdn.net/w397090770/article/details/7845168