Извините за мой английский. Мне нужно поменять некоторые элементы в стеке. Некоторые элементы имеют одинаковые приоритеты, и поэтому, когда элемент активации. Он должен был стоять на первом месте среди элементов с таким же приоритетом.наилучшие элементы сворачивания сложности в стеке
И сделать это, я сначала удалить элемент из стека, а затем вставьте его снова. Но оказывается сложность 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 позже и вставил 1 перед 3. Также вам действительно нужно использовать std :: stack для этого? Я могу думать о разных способах написания этого кода с использованием разных stl-контейнеров –
Я думаю, что это не стек, в котором вы нуждаетесь. Может быть, очередь с приоритетом? –
@Viniyo Shouta 3, 1, 5 приведет к проверке только 5 -> 3 -> 1. Эта тестовая задача, и она заявила, что использует std :: stack. –