全排列、判斷棧序、火車進出站

來源:互聯網
上載者:User

1、全排列:

(1)遞迴實現:

void myFullSort(vector<int> data, int k, int end){int i;if (k == end){for (i = 0; i <= end; i++){cout << data[i] << " ";}cout << endl;}else{for (i = k; i <= end; i++){std::swap(data[k], data[i]);myFullSort(data, k + 1, end);std::swap(data[k], data[i]);}}}



(2)非遞迴實現:


(3)運用STL中的函數next_permutation( ):

#include <iostream>  #include <algorithm>  #include <vector>using namespace std;//STL —— next_permutation()void permutation(vector<int> array, int len){sort(array.begin(), array.end());    //必須首先對未經處理資料進行排序,否則無法得到全部的全排列()do{for (int i = 0; i < len; ++i){cout << array[i] << " ";}cout << endl;} while (next_permutation(array.begin(), array.end()));    //next_permutation是根據數字大小在找下一個排列}int main(){vector<int> a = { 3, 2, 1, 4 };permutation(a, a.size());return 0;}

(4)如果資料中有重複數字,則需要剔除重複的全排列序列:

bool IsSwap(vector<int>& pszStr, int nBegin, int nEnd){for (int i = nBegin; i < nEnd; i++){if (pszStr[i] == pszStr[nEnd])return false;}return true;}void myFullSort(vector<int> data, int k, int end){int i;if (k == end){for (i = 0; i <= end; i++){cout << data[i] << " ";}cout << endl;}else{for (i = k; i <= end; i++){if (IsSwap(data, k, i)){std::swap(data[k], data[i]);myFullSort(data, k + 1, end);std::swap(data[k], data[i]);}}}}


2、判斷棧序:

bool  isPopsort(vector<int> Push, vector<int> Pop){size_t size1 = Push.size();size_t size2 = Pop.size();if (size1 == 0 || size2 == 0)return false;stack<int> tmp;   //輔助棧for (size_t i = 0, j = 0; i < size1; i++){tmp.push(Push[i]);//如果不是出棧序列元素,就一直壓棧        while (j < size2 && !tmp.empty() && Pop[j] == tmp.top())   //開始判斷{tmp.pop();j++;}}return tmp.empty();}



3、火車進出站:(上面兩者的組合)

#include <iostream>#include <vector>#include <stack>using namespace std;vector<int> input;bool  isPopsort1(vector<int> Push, vector<int> Pop){size_t size1 = Push.size();size_t size2 = Pop.size();if (size1 == 0 || size2 == 0)return false;stack<int> tmp;   //輔助棧for (size_t i = 0, j = 0; i < size1; i++){tmp.push(Push[i]);//如果不是出棧序列元素,就一直壓棧while (j < size2 && !tmp.empty() && Pop[j] == tmp.top())   //開始判斷{tmp.pop();j++;}}return tmp.empty();}void myFullSort1(vector<int> data, int k, int end){int i;if (k > end){if (isPopsort1(input, data))       //全排列必須是棧序,才可以輸出{for (i = 0; i <= end; i++){cout << data[i] << " ";}cout << endl;}}else{for (i = k; i <= end; i++){std::swap(data[k], data[i]);myFullSort1(data, k + 1, end);std::swap(data[k], data[i]);}}}int main(){int N;cin >> N;for (int i = 0; i < N; i++){int tmp;cin >> tmp;input.push_back(tmp);}myFullSort1(input, 0, N - 1);return 0;}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.