判斷一個序列是否爲棧的輸出序列

題目描述:輸入兩個整數序列。其中一個序列表示棧的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章