對不起,我的英文。我需要交換堆棧中的一些元素。有些元素具有相同的優先級,因此當激活元素時。他必須在同樣重要的要素中站在第一位。堆棧中最佳複雜性交換元素
而要做到這一點,我先刪除從堆棧中的元素,然後重新插入。但它證明了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);
}
}
那麼好還是壞呢?
如果我正確地讀了這個,你的代碼只在插入時檢查堆棧的頂部,如果你插入3然後是5然後1呢?你的堆棧會是3,1,5,因爲它插入了3然後是5,但是之後它只檢查了5,然後在3的前面插入了1。還有,你是否真的必須使用std :: stack?我可以考慮使用不同的stl容器編寫代碼的不同方法 –
我認爲它不是您需要的堆棧。優先隊列可能? –
@Viniyo Shouta 3,1,5將導致5 - > 3 - > 1剛剛檢查。這個測試任務和它聲明使用std :: stack。 –