Блог пользователя tsoy

Автор tsoy, 11 лет назад, По-русски

Пускай у нас есть два стека, которые за О(1) могут корректным образом выполнять операции добавки в конец, взятия значения последнего элемента, удаления последнего элемента, нахождения количества элементов в стеке.

Спрашивается, можно ли реализовать очередь, используя только эти два стека. Необходимо корректным образом добавлять элемент в конец очереди, брать значение в начале очереди, удалять значение в начале очереди и возвращать размер очереди.

Спасибо за внимание. Задача из уст Ставровского Андрея Борисовича.

Мне в голову пришло только решение, которое выполняет добавку за константу и извлечение за линию.

  • Проголосовать: нравится
  • +4
  • Проголосовать: не нравится

»
11 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится
»
11 лет назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится
stack<int> top, tail;

int q_size() {
  return top.size() + tail.size();
}

int q_push(int x) {
  tail.push(x);
}

void q_transform() {
  if (top.empty()) {
    while (!tail.empty()) {
      top.push(tail.top());
      tail.pop();
    }
  }
}

void q_pop() {
  q_transform();
  top.pop();
}

int q_front() {
  q_transform();
  return top.top();
}

Вроде все ок. Если найдете ошибки, пишите. Извините за говнокод, но идея вроде ясна. Если нет, то распишу подробнее.

UPD. Не успел, уже ответили(

»
11 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится

Здесь описана идея работающая за амортизированное О(1).

»
11 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

http://e-maxx.ru/algo/stacks_for_minima

Смотрите раздел "Модификация очереди. Способ 2"

UPD: Опередили

»
11 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Огромное спасибо всем ответившим :)

»
11 лет назад, # |
Rev. 2   Проголосовать: нравится +12 Проголосовать: не нравится

Мне казалось, я больше тебя не встречу после того случая, но судьба решила по-другому...

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится -6 Проголосовать: не нравится

    ПРЕСВЯТЫЕ УГОДНИКИ!!!11 ПОСОНЫ ТУТ ТСОЯ ЗАТРАЛИЛИ