關於給定棧求出所有合法棧的思考

2021-07-13 09:12:59 字數 1277 閱讀 2274

關於給定棧求出所有合法棧的思考

前幾天看到一篇關於給定幾個元素,給乙個出棧的順序,判斷出棧的順序是否合法,我們也可以通過給定的元素順序求出所有的合法的出棧順序,困擾我的問題是如何求出給定元素的所有的排列問題,之前有篇博文也有求三個數的全序列的,但採用的是三個for迴圈,實在是too young too ******,效率低不說,而且沒有一點實用性,總不能幾個數幾個for迴圈,這也太傻了(

對於判斷出棧的合法性問題,我先把思想寫出來,至於**實現需要過兩天,求所有的合法出棧順序有兩種思路。

方案1:一種是將所有元素的排列求出來,然後將每種都帶入到判斷棧的合法性的函式中,從而將合法的選出來。

方案2:第二種思路是利用之前括號匹配的思想,壓棧為0,出棧為1,出棧的前提是0的個數大於1的個數,然後將所有的可能儲存下來,就是所有的合法出棧順序。

很明顯方案2效率高,但博主對於第二中方案的實現實在有壓力,先把第一種簡單實現下,第二中方案的實現盡快補上(

方案一**如下:

#define _crt_secure_no_warnings 1

#include

using namespace std;

#pragma once

#include

#include

using namespace std;

bool check_push_pop(int* ppush, int* ppop, int length)

//(1)for迴圈控制什麼,記錄彈出了幾個元素

//ppush[1,2,3,4,5]   ppop[4,5,3,2,1]     控制壓入了幾個元素                                       

//(2)為什麼要進行判空  當棧中為空時必須進行壓棧操作

//(3)此時所有元素已經壓棧但並沒找到出棧的元素,證明出棧的元素不合法

void swap(int *a, int *b) //交換陣列中的兩個元素

void perm(int *list, int i, int n,int& count,int* push)

int main()

方案1的實現的難點主要在於遞迴的使用,實現的思想是將陣列中的每一元素放在第一位,然後遞迴將第二位當做第一位繼續遞迴,直至i等於n,列印出來隨後的過程是從後向前逐個交換,從而實現全排列。全排列的陣列傳到斷 check_push_pop()函式中判斷,若合法則列印,否則不列印。

方案2隨後奉上

博主學識尚欠,若有理解錯誤的地方,請大神指出錯誤,

本文出自 「qin-wang」 部落格,請務必保留此出處

給定入棧序列判斷給定出棧序列是否合法

題目 輸入兩個整數序列。其中乙個序列表示棧的入棧順序,判斷另乙個序列有沒有可能是對應的出棧順序。思路 用乙個輔助棧,將入棧序列按照某種順序入棧,看是否可以產生出棧序列即可。1 如果當前棧為空,且入棧序列不空,則入棧序列的下乙個元素入棧 2 如果當前輔助棧的棧頂元素不等於出棧序列的首元素,那麼入棧序列...

關於給定入棧順序,求所有可能的出棧順序的討論

最近學習資料結構,關於給定入棧順序,求所有可能的出棧順序的問題有些迷惑 現在也是 於是搜尋了一些相關的材料。我覺得可能是因為目前我沒有理解問題而無法得出答案。詳情見下。先給出算所有出棧可能的個數的公式,由卡特蘭數可以得到 n 2n n n 1 該公式 c 2n,n n 1 c 2n,n 表示2n裡取...

給定入棧順序,輸出所有可能出棧情況及所有情況的總數

乙個長度為n的無重複序列入棧的所有出棧方式 例如1 2 3這三個數字,入棧並出棧共有5種方式,分別為 321 312 231 213 123。那麼對於長度為n的無重複序列中所有的出棧方式有哪些呢?為了設計計算的演算法,我們可以用佇列 queue 來模擬輸入,佇列的輸出則按照原先序列的順序。使用乙個棧...