題目描述:
元素出棧、入棧順序的合法性。如:入棧的序列(1,2,3,4,5),出棧序列爲(4,5,3,2,1),則合法。
入棧的序列(1,2,3,4,5),出棧序列爲(4,5,2,3,1),則不合法。
難點分析:
在出棧、入棧操作隨機性比較強,不好把握它們的動態變換。
但是,要牢記棧的性質“後進先出”。第一個出棧的元素,肯定是當時棧空間中元素中最後進入的。即使,後來又有新的元素入棧,但是我們知道它們的入棧順序,和出棧順序,就可以模擬出,當時元素入棧、出棧的情況。
思路:
可以利用一個輔助的棧空間。
1,把第一個序列v1中的數字逐個壓入棧中,壓入的過程中把第二個序列v2中元素與棧首元素比較。
2,如果相同,則出棧,同時,v2下標往後移,準備進行下一次比較。
3,如果不同,則將v1中數據依次入棧,直到滿足1中的條件或者沒有數據爲止。
實現代碼:
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
template <typename T>
bool Check_Out_Stack_Order(const vector<T>& v_1, const vector<T> v_2)
{
//兩個序列個數不相同
if (v_1.size() != v_2.size())
return false;
//此時v_1,v_2中元素個數肯定相同
stack<T> s; //輔助棧,造成v_2序列的棧,這裏稱爲原棧
size_t index_1 = 0; //作爲v_1的下標
size_t index_2 = 0; //作爲v_2的下標
while (index_2 < v_2.size()) //包含了v_1,v_2都爲空的情況
{
//當s爲空,或輔助棧頂元素不等於v_2[index_2]時,v_1中元素要不停的入輔助棧,直到沒有元素可用
while (s.empty() || s.top() != v_2[index_2])
{
if (index_1 < v_1.size())
s.push(v_1[index_1++]);
else
return false; //將v_1中數據全部入棧,還是沒有在v_2中發現有相等的,說明,兩個序列含有的數據不一樣
}
//此時,s.top()=v_2[index_2],說明原棧此處有出棧操作,得到v_2中的v_2[index]。
s.pop();
++index_2;
}
if (s.empty())
return true;
else
return false;
}
實驗實例:
int main()
{
vector<int> v1 = { 1,2,3,4,5 };
vector<int> v2 = { 4,5,3,2,1 };
vector<int> v3 = { 4,5,2,3,1 };
cout << "v1 與 v2是否滿足出棧、入棧的合法性?";
if (Check_Out_Stack_Order(v1, v2))
cout << " 滿足" << endl;
else
cout << "不滿足" << endl;
cout << "v1 與 v3是否滿足出棧、入棧的合法性?";
if (Check_Out_Stack_Order(v1, v3))
cout << " 滿足" << endl;
else
cout << "不滿足" << endl;
system("pause");
return 0;
}