Как является нажатие () лугом и поп () определенный ping?

Я знаю, как нажатие () и поп () методы в типичной реализации Очереди/Связанного списка работают, но что я действительно хочу знать, то, что Вы на самом деле определяете как нажатие или поп? Когда можно назвать нажатие метода () / поп ()? Что делает вставку ()/, добавляют () метод в типичной Древовидной реализации не нажатие ()?

Мое понимание - то, что нажатие () луг означает помещать что-то в положение, на которое указывает некоторый специальный указатель, и поп () проверяет с помощью ping-запросов средства элемента поместить некоторый объект далеко, некоторый указатель указывает, но это, кажется, ясно не определяется. Или именование имеет значение вообще?

12
задан helpermethod 10 May 2010 в 17:59
поделиться

12 ответов

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

Если вы извлекаете элементы из того же конца списка, что и добавляете, вы реализовали стек или структуру данных Last-In-First-Out (LIFO):

Stack

Если вы извлекаете элементы из противоположного end, значит, вы реализовали очередь - хотя обычно используются термины «постановка в очередь» и «исключение из очереди». Это структура данных в порядке очереди (FIFO):

Queue

37
ответ дан 2 December 2019 в 03:06
поделиться

Pushing означает помещение элемента в стек (структуру данных), так что он становится самым верхним элементом стека. Выталкивание означает удаление самого верхнего элемента из стека. (Часто можно услышать третий термин, peeking, который означает просмотр/чтение самого верхнего элемента. )

Когда речь идет об очередях, обычно используют термины enqueueing и dequeueing, где первый означает добавление элемента в "задний конец" очереди, а второй - удаление элемента из "переднего конца" очереди.

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

Когда речь идет о связанных списках и двусторонних очередях (deques), также используются термины push и pop, напр. например, в STL C++, где есть такие операции, как push_front, push_back, pop_front и pop_back. Они просто подразумевают, что элементы могут быть добавлены или удалены с обоих концов.


Что касается того, почему pop называется именно так, а не pull (в отличие от push)... хороший вопрос.

2
ответ дан 2 December 2019 в 03:06
поделиться

Push/Pop первоначально относились к командам стека в asm land. Команда push помещает значение (регистр) в стек и обновляет указатель стека, а команда pop забирает значение из стека и уменьшает указатель. Здесь нет вставки, что означало бы существование какого-то смещения. Вот почему у вас также есть функции push/pop _front() и push/pop _back(). Они представляют собой статическое местоположение, из которого работает push/pop.

1
ответ дан 2 December 2019 в 03:06
поделиться

По крайней мере, в C ++ push и pop относятся только к таким структурам, как стеки и очереди, где место, в котором происходит операция, заложено в структуре данных. Для других контейнеров, таких как векторы и списки, у нас есть push_back, push_front, pop_back и т. Д. Для контейнеров, где мы действительно не знаем, где окажется элемент или откуда мы его будем читать, push и pop не используются в все.

1
ответ дан 2 December 2019 в 03:06
поделиться

Push и Pop - это обычные названия операций вставки и удаления элементов из структуры данных стека. Любые операции, которые следуют схеме "последний-первый-выход" (LIFO), обычно называются Push и Pop, но их можно называть как угодно.

1
ответ дан 2 December 2019 в 03:06
поделиться

Названия push и pop, вероятно, были придуманы только для того, чтобы отличить операции, которые можно выполнить над стеком, от операций, которые можно выполнить над списком. С тем же успехом их можно назвать add и remove, но они подразумевают, что вы можете добавить или удалить элемент в любом месте списка, а не только в его начале (или конце, если вы так считаете). Аналогично, enqueue и dequeue существуют потому, что push и pop подразумевают, что вставки и удаления происходят в одном и том же месте, а не в противоположных концах списка.

Если вам нужно техническое определение, то можно сказать, что push и pop - это O(1) операции, которые воздействуют на один и тот же конец списка по принципу LIFO (Last In, First Out).

1
ответ дан 2 December 2019 в 03:06
поделиться

Отправка - это просто добавление элемента в начало (или конец) коллекции. Поппинг - это удаление того же самого элемента.

В Java интерфейс List имеет добавление (0, элемент) и удаление (0). По сути, это параллели push (item) и pop ().

Однако push и pop и стеки интересны своим специфическим поведением, и поэтому многие из них имеют специализированные структуры данных, которые делают push и popping особенно эффективными.

0
ответ дан 2 December 2019 в 03:06
поделиться

Большая часть того, о чем вы спрашиваете, является условностью. Для очередей вы можете нажать или поставить в очередь. Вы увидите оба. Для стеков вы увидите добавление или нажатие. Для этого нет никаких жестких и быстрых правил. Если вы работаете на языке, который использует «push» как соглашение, используйте «push». Название имеет значение, но только для удобства использования и здравого смысла. Просто убедитесь, что ваше именование согласовано в рамках одного приложения или системы.

0
ответ дан 2 December 2019 в 03:06
поделиться

Названия push и pop используются, когда речь идет о стеках. Стеки работают по принципу "последний вошел - первый вышел" (LIFO). Таким образом, эти имена указывают на то, что pop вернет последнюю вытолкнутую вещь.

0
ответ дан 2 December 2019 в 03:06
поделиться

Термины push и pop обычно используются для стеков, а не для очередей или связанных списков. Стек - это структура данных типа LIFO (last-in-first-out); другими словами, первым удаляется элемент, который был добавлен последним. Push - это когда вы кладете новый элемент в стек, а pop - когда вы его снимаете.

Многие языки программирования позволяют писать код как угодно, включая использование имен push и pop для любых и всех структур данных, даже если на самом деле это не то, что вы делаете. Однако я бы не рекомендовал этого делать. Гораздо лучше использовать термины, которые используют другие, чтобы ваш код мог быть прочитан другими программистами. Кроме того, использование неправильной терминологии может затруднить получение работы и затруднить общение с другими программистами, если вы работаете над проектом (рабочим или с открытым исходным кодом).

8
ответ дан 2 December 2019 в 03:06
поделиться

Push и pop изначально использовались для обозначения операций со стеком, но неофициально эти термины часто используются для операций, связанных с добавлением/удалением элемента в конце любой линейной структуры данных, такой как стек, очередь, массив или связанный список.

1
ответ дан 2 December 2019 в 03:06
поделиться

Интуитивно мы думаем о стеках как о тех объектах, на которые мы можем помещать значения, верхнее значение которых - это то, что было отправлено последним, и что если мы вытолкнем стек, в который мы поместили значение, у нас есть исходный стек.

Эту интуицию можно представить как абстрактную алгебру , с Push и Pop, представляющими любые вычисления над объектом данных, называемым стеком, включающим элементы:

algrebra Stack
  {
    data Stack;
    data Element;
    Empty() -> Stack;
    Push(Stack,Element) -> Stack;
    Pop(Stack) -> Stack;
    Top(Stack) -> Element;
    axiom Top(Push(s,e))==e;
    axiom Pop(Push(s,e))==s;
    axiom Pop(Empty())==undefined;
 }

Это означает, что если вы можете найти объекты в своей системе,

  • некоторые из которых, как вы утверждаете, являются типами стека
  • , некоторые из которых вы утверждаете как элементы,
  • некоторые из них являются функциями, которые, как вы утверждаете, являются Push,
  • некоторые из них являются функциями которые вы утверждаете: Pop, Top, Empty и т. д.

то сигнатуры различных функций совпадают с сигнатурами в алгебре, , и что, если вы примените различные функции, они будут вести себя так, как в соответствии с аксиомами. (Выбранные вами объекты "изоморфны" алгебре).

Преимущество этой точки зрения состоит в том, что она ничего не говорит о реализации различных сущностей, но при этом фиксирует суть. Эта алгебра охватывает различные обсуждаемые артефакты в других ответах; должно быть ясно, что линейная область хранения, используемая в качестве стека, является стеком, что связанный список, используемый стеком, является стеком, что двухсторонняя очередь, используемая одним концом, является стеком , что набор дисковых блоков, используемых в качестве стека, является стеком, ...

Что действительно круто, так это то, что вы можете переименовать все типы данных и функции внутри алгебры стека , и все же распознавать стек, потому что переименование не влияет на изоморфизмы (поскольку последовательное переименование - это просто еще один изоморфизм, и изоморфизмы составляют изоморфизмы произведения). Все, что соответствует этой спецификации , является стеком!

Тот факт, что имена функций в реализации могут быть любыми и все же совпадать, и что мы можем переименовывать имена функций абстрактной алгебры в любые имена и при этом совпадать, позволяет нам, по соглашению, чтобы дать абстрактным функциям алгебры, называются те, которые мы считаем репрезентативными. "Push" и "pop" выбраны по соглашению.

Итак, я бы сказал, вы можете называть свои функции реализации как угодно , но называть их Push и Pop, если их действия реализуют эту алгебру.

Итак, можно определить стек с помощью формальной спецификации.Таким же образом можно определить любую другую структуру данных .

Жаль, что мы больше не делаем этого при документировании реального кода.

0
ответ дан 2 December 2019 в 03:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: