判斷出棧順序合法性的兩種方法

文章目錄

今天偶然看到一個面試題, 題目是這樣的:

給我們兩個序列,第一個序列表示棧的壓入順序,然後讓判斷第二個序列是不是是否是該棧的彈出序列
現設第一個序列爲[1,2,3,4,5],第二個序列爲[3,2,5,4,1],可以看出這個出棧順序是合法的,那麼我們怎麼通過程序來驗證呢?

思路:

首先要根據棧的先進後出原則, 分析出來的 要比較的一定是題意中 輔助棧s 和 出棧數組stack_out的首個元素是否相等.

相等則是滿足順序, 輔助棧s彈出, 出棧數組stack_out指向下一個元素, 繼續下一步模擬

最後如果輔助棧s空了, 那就說明順序完全相同, 反之不同.


後來看到了一個判斷出棧順序的規律:

對每一個元素,其後所有 小於 此元素值 的元素 是 降序排列的.

eg:
[1,2,3,4,5,6,7,8,9] 合法
[9,8,7,6,5,4,3,2,1] 合法
[4,5,3,2,7,6,1,8,9] 合法
[3,4,5,1,2,9,8,7,6] 非法

/***
 * @Author      : acmaker
 * @Date        : 2020-03-20 20:23:20
 * @LastEditTime: 2020-03-20 20:53:54
 * @FilePath    : \myCPlusPlusCode\DataStructure\MoocWork\StackOder.cpp
 * @Website     : http://csdn.acmaker.vip
 * @Description :
 */

#include <bits/stdc++.h>
using namespace std;

bool Check(int stack_in[], int stack_out[] ) {
    int len_in = sizeof(stack_in) / sizeof(stack_in[0]),  //入棧序列長度
        len_out = sizeof(stack_out) / sizeof(stack_out[0]);  //出棧序列長度

    if ( len_in!=len_out ) return false;

    stack<int> s;
    for ( int i = 0, j = 0; i < len_in; ++i) {
        s.push(stack_in[i]);
        while (s.top() == stack_out [j] && s.size()) { //入棧序列棧頂元素與當前出棧序列元素不相等,不合法 
            s.pop();
            ++j;
        }
    }
    return (s.size() ? false : true);  //當所有出棧序列元素都匹配完之後,棧不爲空,不合法
}

int main() {

    int stack_in[] = {1, 2, 3, 4, 5};                     //入棧序列
    int stack_out[] = {4, 5, 3, 2, 1};                    //出棧序列

    bool res = Check(stack_in, stack_out);

    cout << ( res ? "不合法!" : "合法" ) << endl;


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