出棧序列的遍歷
阿新 • • 發佈:2019-01-24
怎麼樣把所有的可能的出棧順序輸出的
在網上查找了很多關於怎麼樣把所有的可能的出棧順序輸出的的文章,不過遺憾的是,大部分的文章都是隻是說這個是卡特藍數,然後給出一個公式而這個往往只是一個可以求出有多少種可能的公式,網上的文章更加傾向於討論什麼問題適用卡特藍數。頂多就是看到下面的程式碼:#include "stdafx.h" #include <iostream> #include <vector> using namespace std; void func(vector<char>kind, int count[], int n) { if (count[0] >= 1) { kind.push_back('('); count[0]--; func(kind, count, n); count[0]++; kind.pop_back(); } if ((count[1] >= 1) && (count[1] > count[0])) { kind.push_back(')'); count[1]--; func(kind, count, n); count[1]++; kind.pop_back(); } if (kind.size() == 2 * n) { vector<char>::iterator iter; for (iter = kind.begin(); iter != kind.end(); iter++) { cout << (*iter) << " "; } cout << endl; } } int main() { int n; cout << "please input the number of ():" << endl; cin >> n; int count[2] = { n - 1,n }; vector<char>kind; kind.push_back('('); func(kind, count, n); return 0; }
我想你肯定第一次看到這個東西肯定是一頭霧水吧!我也是。不過我現在懂了我在這裡和大家分享一下吧。 1.問題的模型 在這裡我們假設出棧代表數字‘0’,入棧代表數字‘1’。我們的問題就可以轉換成求‘0’‘1’的組合序列有多少種了。那麼是不是‘0’,‘1’可以任意組合呢?答案肯定是no。 這個‘0’,‘1’的組合必須滿足卡特蘭數的規則: 1. 在‘0’的前面的序列‘1’的個數必須大於‘0’的個數(也就是說類似100這種序列是不可能的)。為什麼?因為‘1’代表入棧,‘0’代表出棧。入棧的次數必須大於出棧的次數你才可以繼續出棧啊…..這個應該沒什麼問題吧。 2. ‘0’和‘1’的個數是有限的。比如說你要求4個數的出棧入棧序列。那麼你就只有4個‘1’和4個‘0’,所以像“11111111”這種序列是不可能的雖然滿足第一點的要求。
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
#include <stack>
using namespace std;
//這裡以括號的匹配來說明出棧序列的輸出,因為這兩個問題實質都是一樣的
int c = 0;
void function(int number)
{
vector<char> v; //問題就是有多少種滿足條件的序列。
v.push_back('<');//第一個元素看到是<這個是肯定的。
int count[2] = { number - 1,number }; //cout表示還有幾個<和>需要添進去。
stack<int> s; //用s來記錄有兩種情況的坑。
loop:
while (v.size() < 2*number)
{
if (count[0] > 0)
{
v.push_back('<');
if (count[1] > count[0])
s.push(v.size() - 1);
count[0]--;
}
else if(count[1] > 0)
{
v.push_back('>');
count[1]--;
}
}
for (auto x : v)
{
cout << x;
}
c += 1;
cout << c;
cout << endl;
if (!s.empty())
{
int n = s.top(); //n是下標
s.pop();
for (size_t i = 2*number-1; i >= n; i--)
{
if (v[i] == '<')
{
count[0]++;
}
else
{
count[1]++;
}
v.pop_back();
}
v.push_back('>');
count[1]--;
goto loop;
}
}
int main()
{
cout << "請你輸入個數 :" << endl;
int n;
cin >> n;
function(n);
return 0;
}