【发布时间】:2017-05-18 23:18:30
【问题描述】:
对不起我的英语。我需要交换堆栈中的一些元素。 有些元素具有相同的优先级,因此在激活元素时。在同等优先级的元素中,他必须站在第一名。
为此,我首先从堆栈中删除一个元素,然后再次插入它。但事实证明复杂度为 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。
-
@Yevhen Kuzmovych 这个测试任务并声明使用std::stack。
标签: c++ c++11 stack time-complexity