2017-01-04 25 views
0

對不起,我的英文。我需要交換堆棧中的一些元素。有些元素具有相同的優先級,因此當激活元素時。他必須在同樣重要的要素中站在第一位。堆棧中最佳複雜性交換元素

enter image description here

而要做到這一點,我先刪除從堆棧中的元素,然後重新插入。但它證明了O(n * 2)的複雜性。我理解正確嗎?它可以以某種方式更好?

typedef std::shared_ptr<AdaptedWidget> window_ptr; 
std::stack<window_ptr> m_windowsStack; 

插入元件:

Insert with sorting by - int priority 
void WindowManager::insertToStack(window_ptr window) 
{ 
    if (!m_windowsStack.empty() && window->priority() <= m_windowsStack.top()->priority()) 
    { 
     auto top = m_windowsStack.top(); 
     m_windowsStack.pop(); 
     insertToStack(window); 
     m_windowsStack.push(top); 
    } 
    else 
    { 
     m_windowsStack.push(window); 
    } 
} 

delete元素:

void WindowManager::deleteWindow(std::string title) 
{ 
    if (!m_windowsStack.empty()) 
    { 
     auto top = m_windowsStack.top(); 

     if(top->windowTitle().toStdString() != title) 
     { 
      m_windowsStack.pop(); 
      deleteWindow(title); 
     } 
     else 
     { 
      m_windowsStack.pop(); 
      return; 
     } 
     m_windowsStack.push(top); 
    } 
} 

交換元件:

void WindowManager::swapWindowSamePriority(std::string title) 
{ 
    auto window = findWindow(title); 

    if(window) 
    { 
     deleteWindow(title); 
     insertToStack(window); 
    } 
} 

那麼好還是壞呢?

+1

如果我正確地讀了這個,你的代碼只在插入時檢查堆棧的頂部,如果你插入3然後是5然後1呢?你的堆棧會是3,1,5,因爲它插入了3然後是5,但是之後它只檢查了5,然後在3的前面插入了1。還有,你是否真的必須使用std :: stack?我可以考慮使用不同的stl容器編寫代碼的不同方法 –

+1

我認爲它不是您需要的堆棧。優先隊列可能? –

+1

@Viniyo Shouta 3,1,5將導致5 - > 3 - > 1剛剛檢查。這個測試任務和它聲明使用std :: stack。 –

回答

2

我想我明白了。實際上覆雜度爲O(n * 3),因爲find(),delete()insert()都是O(n)。

我建議你swap()方法創建新的堆棧:

// example stack: 
// 1->1->2->*2*->2->2->3->3->4->5 
//   ^
//  element to move (swap) 
void WindowManager::swapWindowSamePriority(std::string title) 
{ 
    if (m_windowsStack.empty()) return; 

    std::stack<window_ptr> tempStack; // temporary stack 
    while(title != m_windowsStack.top()->windowTitle().toStdString()) 
     // searching for needed element and moving element to tempStack 
     tempStack.push(m_windowsStack.pop()); 

    auto window = m_windowsStack.pop(); // found window. 

    // m_windowsStack: 1->1->2 
    // window: *2* 
    // tempStack: 5->4->3->3->2->2 

    // at this moment in m_windowsStack you have elements that were before window 
    // and in tempStack - elements that were after it. 

    while(tempStack.top()->priority() == window->priority()) 
     // pushing back elements from tempStack to m_windowsStack while thay have same priority as found window 
     m_windowsStack.push(tempStack.pop()) 


    // m_windowsStack: 1->1->2->2->2 
    // window: *2* 
    // tempStack: 5->4->3->3 

    // at this moment we have moved all elements with the same priority as found window to m_windowsStack. 

    m_windowsStack.push(window) // pushing found window on top of elements with the same priority 

    // m_windowsStack: 1->1->2->2->2->*2* <-- that we needed 
    // tempStack: 5->4->3->3 

    while(!tempStack.empty()) 
     // moving remaining elements from tempStack to m_windowsStack 
     m_windowsStack.push(tempStack.pop()) 

    // m_windowsStack: 1->1->2->2->2->*2*->3->3->4->5 
    // tempStack: empty 

} 

這給你O(N * 2)最壞的情況avarage和O(N)。

+0

你是上帝! :) –

+1

@nax希望它的工作;) –

+0

@nax,不要忘記檢查你的'm_windowsStack'是不是空的。更新。 –