私の英語のために申し訳ありません。私はスタック内のいくつかの要素を交換する必要があります。 いくつかの要素は同じ優先順位を持ち、したがって起動要素がある場合。彼は同じ優先順位で要素の中の最初の場所に立つ必要があった。スタック内の最も複雑なスワップ要素
そして、これを行うには、私が最初にスタックから要素を削除し、再度挿入してください。しかし、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);
}
}
削除エレメント:
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を使用すると述べました。 –