1 #include 2 #include 3count[0]存著左括號數目,count[1]存著右括號數目。一開始kind中壓入左括號,因為第乙個肯定是左括號。然後count陣列初始化為n-1個左括號,n個右括號。然後我們遞迴的處理。如果剩餘左括號數count[0]大於0,就可以把左括號壓棧。而對於右括號,棧中左括號個數必須多於右括號個數,也就是剩餘右括號個數大於左括號個數,即count[1]>count[0]時,才能將右括號壓棧。如果棧中元素個數達到2n時,就把棧中元素輸出。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 }
下面貼出出棧序列**,幾乎和上面相同。
1 #include 2 #include 3 #include 4要注意到前一題括號的(*iter)是對棧內元素進行輸出,而後一題序列(*iter)是考慮出棧的順序~~~~糾結一晚上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 }
1view code/***************
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
由入棧 出棧序列求所有出棧 入棧序列
給出乙個陣列,代表入棧順序,求所有出棧可能性?給出乙個陣列,代表出棧順序,求所有入棧可能性?這兩題解法相同,可利用全排列求出所有組合,再進行可能性分析。全排列 如下 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很容易看出來,本題目是一道遞迴題。可以通過窮...