17_7_20:元素入棧出棧的合法性檢測

題目描述:
元素出棧、入棧順序的合法性。如:入棧的序列(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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章