【數據結構】 出棧序列的合法性【面試】

以前咱們對棧已經有所瞭解,先進後出,後進先出這是棧的兩大特性,那麼,咱們常常會碰到這種題,例:ios

有一組元素abcdef,按前後順序進棧,那麼出棧時哪些狀況是非法的?ide

A.   fedcba
spa

B.   abdcef
it

C.   acbdefio

D.   abcdefclass

選哪一個呢???stream

很明顯,根據棧的兩大特性:先進後出,後進先出,便可判斷,答案:Ctop

剖析: 先看C選項acb這樣的出棧序列,那麼進棧確定是abc,那麼顯然出棧時c確定不會在b以前,就這麼簡單。用代碼實現這個合法性的判斷,固然也是比較容易的,只要思路邏輯清楚,就沒有問題。註釋



代碼以下:di

#include <iostream>
#include <stack>
#include <cassert>
using namespace std;

bool isLegalSequence(const char* Push_seq,const char* Pop_seq)
{
    assert(Push_seq);
    assert(Pop_seq);

    //判斷出入棧序列長度是否相等
    if ( strlen(Push_seq) != strlen(Pop_seq) ) 
        return false;

    stack<char> stk;
    while ( *Push_seq)
    {
        // 先判斷棧是否爲空,而後判斷棧頂元素是否和出棧序列的元素相同
        if (0 == stk.size() || stk.top() != *Pop_seq)
        {
            stk.push(*Push_seq++); // 不相同就壓棧,繼續向後找
        }
        else
        {
            stk.pop(); //找到相同的,出棧
            ++Pop_seq; //跳到出棧序列的下一個元素驗證
        }
    }

    while (stk.size()) // 將剩餘的出棧序列元素判斷
    {
        if (stk.top() != *Pop_seq)
        {
            return false;
        }
        stk.pop();
    }

    return true;
}

int main()
{
    char* str1 = "abcdef";
    char* str2 = "baedcf";
    cout << ( isLegalSequence(str1, str2) ? "yes" : "no" ) << endl;

    system("pause");
    return 0;
}

因爲系統的棧是現成的,咱們能夠直接拿來使用,這樣問題大大簡化,具體的實現步驟過程,代碼中也有註釋,簡單易懂。

相關文章
相關標籤/搜索