2014-12-29 59 views
1

我有一排數字,我想把它放入堆中。它的放置方式是觀察樁(它們應該總是按尺寸排列),如果發現一個樁的數量小於第一個樁的數量,那麼將它放在樁的前面;如果它比堆中的最後一個數字更大,則將它放在堆的後面。如果以上都不是真的,那麼你會創造一個新的樁。例如:把數字放入不同的堆

輸入:

2 5 4 3 4 5 7 6 5 0 // 0 is used for end of input 

輸出:

3 4 5 7 
2 5 6 
4 5 

的程序編譯和作品,但它不應該(不同的結果)的方式。代碼如下:

#include <iostream> 
#include <deque> 
#include <vector> 
using namespace std; 
    void sort_by_size(vector<deque<int>>& container) 
    { 
    for(int i=0;i<container.size();i++) 
     for(int j=i;j<container.size();j++) 
     if(container.at(i).size()<container.at(j).size()) 
      swap(container.at(i),container.at(j)); 
    } 
int main() 
{ 
    int n; 
    vector<int> all_dishes; 
    while(n!=0) 
    { 
    cin>>n; 
    if(n!=0) 
    all_dishes.push_back(n); 
    } 
    vector<deque<int>> piles ; 

    for(int i=0;i<all_dishes.size();i++) 
    { 
    sort_by_size(piles); 
    bool smaller = false; 
    bool greater = false; 
    for(int j=0;j<piles.size();j++) 
    { 
     if(all_dishes.at(i)<*piles.at(j).begin()) 
     { 
      piles.at(j).push_front(all_dishes.at(i)); 
      smaller = true; 
      break; 
     } 

     if(all_dishes.at(i)>*piles.at(j).end()) 
     { 
      piles.at(j).push_back(all_dishes.at(i)); 
      greater = true; 
      break; 
     } 

    } 

    if (smaller==false && greater==false) 
    { 
     deque<int> temp; 
     temp.push_back(all_dishes.at(i)); 
     piles.push_back(temp); 
    } 
    /*cout<<i<<":"<<endl; 
    for(int i=0;i<piles.size();i++) 
    { 
     for(int j=0;j<piles.at(i).size();j++) 
      { 
      cout<<piles.at(i).at(j)<<" "; 
      } 
    cout<<endl; 
    }*/ //for looking what happens at each iteration 
} 

    for(int i =0;i<piles.size();i++) 
    { 
     for(int j=0;j<piles.at(i).size();j++) 
     { 
     cout<<piles.at(i).at(j)<<" "; 
     } 
    cout<<endl; 
    } 
    return 0; 
} 

任何想法什麼是算法的問題,以及如何解決它?

+3

請**編輯**您的文章,幷包括您得到的結果。這樣,每個人都不必運行程序來查明它們是什麼。 –

+0

'sort_by_size'可以使用'std :: sort'(用自定義比較器)。 – Jarod42

+0

@CaptainObvlious好的。 – pesho

回答

1

你有幾個問題。

首先,您的n變量未初始化。這應該會觸發編譯器錯誤。

其次,您嘗試從end()迭代器中取消引用元素。這是不可能的,因爲這指向序列末尾的那個,因此end()不可忽略。你應該使用back()

換句話說,這

if(all_dishes.at(i)>*piles.at(j).end()) 

應該成爲這樣的:

if(all_dishes.at(i) > piles.at(j).back()) 

有了這些改變你的程序的輸出預期的結果。

+0

我同意取消引用'.end()'迭代器是問題;數據的第二次迭代應該在現有2之後添加5,而不是在新的堆中。僅此一點就足以讓OP精心打印,以確定究竟在發生什麼。 –

+0

謝謝你是這個問題。我想我應該更加小心'begin'和'end',而不是使用'front'和'back'。 – pesho