括號和出棧所有序列問題

2021-09-06 12:29:08 字數 1917 閱讀 2533

1 #include 2 #include 3

using

namespace

std;45

6void func(vectorkind,int count,intn)7

16if((count[1]>=1) && (count[1]>count[0

]))17

24if(kind.size()==2*n)

2531 cout<

33}3435

36int

main()37;

42 vectorkind;

43 kind.push_back('('

);44

func(kind,count,n);

45return0;

46 }

count[0]存著左括號數目,count[1]存著右括號數目。一開始kind中壓入左括號,因為第乙個肯定是左括號。然後count陣列初始化為n-1個左括號,n個右括號。然後我們遞迴的處理。如果剩餘左括號數count[0]大於0,就可以把左括號壓棧。而對於右括號,棧中左括號個數必須多於右括號個數,也就是剩餘右括號個數大於左括號個數,即count[1]>count[0]時,才能將右括號壓棧。如果棧中元素個數達到2n時,就把棧中元素輸出。

下面貼出出棧序列**,幾乎和上面相同。

1 #include 2 #include 3 #include 4

using

namespace

std;56

7int number=0;8

void func(vectorkind,int count,int n,inta)9

18if((count[1]>=1) && (count[1]>count[0

]))19

26if(kind.size()==2*n)

2739

else

4044

}45 number++;

46 cout<

48}4950

51int

main()

5262

int count[2]=;

63 vectorkind;

64 kind.push_back(1

);65

66 cout<

the result is:

"<

67func(kind,count,n,a);

68 cout<

total:

"69return0;

70 }

要注意到前一題括號的(*iter)是對棧內元素進行輸出,而後一題序列(*iter)是考慮出棧的順序~~~~糾結一晚上

1

/***************

2輸出棧

3*********************/4

5 #include6 #include7 #include8 #include9 #include10

using

namespace

std;

1112

int key=1,number=0;13

void function(vectorv,int count,int

n)14

24if(count[1]>count[0]&&(count[1]>=1

) )25

32if(v.size()==2*n)

3344

else

4549

}50 number++;

51 printf("\n"

);52}53

}5455int

main()

56

view code

由入棧 出棧序列求所有出棧 入棧序列

給出乙個陣列,代表入棧順序,求所有出棧可能性?給出乙個陣列,代表出棧順序,求所有入棧可能性?這兩題解法相同,可利用全排列求出所有組合,再進行可能性分析。全排列 如下 public list permute int nums 這種方法是什麼意思呢?例如abc,在第0位有三種可能,axx,bxx,cxx...

出棧序列問題

棧之根本 後進先出 last in first out,lifo 要解決這類問題 最本質就是出棧的時候,可以邊入棧邊出棧。考慮 設棧的輸入序列是1,2,3則出棧的序列有?1,2,3 1入棧出棧,2入棧出棧,3入棧出棧 1,3,2 1入棧出棧,2入棧,3入棧出棧,2出棧 2,1,3 1入棧,2入棧出棧...

窮舉所有可能的出棧序列

輸入乙個入棧序列,輸出可能的出棧序列。輸入格式 第一行輸入乙個整數 n 表示入棧序列的長度。第二行輸入 n 個數字,表示入棧序列。輸出格式 輸出所有可能的出棧序列 輸入樣例 3 1 2 3輸出樣例 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1很容易看出來,本題目是一道遞迴題。可以通過窮...