Entschuldigung für mein Englisch. Ich muss einige der Elemente im Stapel tauschen. Einige Elemente haben die gleichen Prioritäten und daher das Aktivierungselement. Er musste auf dem ersten Platz unter den Elementen mit der gleichen Priorität stehen.beste Komplexität Swap-Elemente im Stapel
Und dies zu tun, ich zum ersten Mal ein Element aus dem Stapel löschen und es dann wieder ein. Aber es stellt sich die Komplexität von O (n * 2) heraus. Ich verstehe korrekt? Es kann irgendwie besser sein?
typedef std::shared_ptr<AdaptedWidget> window_ptr;
std::stack<window_ptr> m_windowsStack;
Einsatzelement:
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);
}
}
löschen Element:
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);
}
}
Swap-Elemente:
void WindowManager::swapWindowSamePriority(std::string title)
{
auto window = findWindow(title);
if(window)
{
deleteWindow(title);
insertToStack(window);
}
}
Also gut oder schlecht?
Wenn ich das richtig gelesen habe, überprüft Ihr Code nur die oberste Ebene des Stapels beim Einfügen, was ist, wenn Sie 3, dann 5 und dann 1 einfügen? Ihr Stack wäre 3,1,5, weil er 3 dann 5 eingefügt hat, aber dann hat er nur 5 später überprüft und 1 vor 3 eingefügt. Müssen Sie dafür wirklich std :: stack verwenden? Ich kann an verschiedene Möglichkeiten denken, diesen Code mit verschiedenen STL-Containern zu schreiben –
Ich denke, es ist kein Stapel, was Sie brauchen. Prioritätswarteschlange vielleicht? –
@Viniyo Shouta 3, 1, 5 ergibt 5 -> 3 -> 1 gerade überprüft. Diese Testaufgabe und es angegeben, den Std :: Stack zu verwenden. –