Я знаю, как нажатие () и поп () методы в типичной реализации Очереди/Связанного списка работают, но что я действительно хочу знать, то, что Вы на самом деле определяете как нажатие или поп? Когда можно назвать нажатие метода () / поп ()? Что делает вставку ()/, добавляют () метод в типичной Древовидной реализации не нажатие ()?
Мое понимание - то, что нажатие () луг означает помещать что-то в положение, на которое указывает некоторый специальный указатель, и поп () проверяет с помощью ping-запросов средства элемента поместить некоторый объект далеко, некоторый указатель указывает, но это, кажется, ясно не определяется. Или именование имеет значение вообще?
При обращении к операциям в связанном списке вы можете добавлять элементы в список, чтобы добавить их. Затем вы можете удалить элементы из списка, чтобы удалить их.
Если вы извлекаете элементы из того же конца списка, что и добавляете, вы реализовали стек или структуру данных Last-In-First-Out (LIFO):
Если вы извлекаете элементы из противоположного end, значит, вы реализовали очередь - хотя обычно используются термины «постановка в очередь» и «исключение из очереди». Это структура данных в порядке очереди (FIFO):
Pushing означает помещение элемента в стек (структуру данных), так что он становится самым верхним элементом стека. Выталкивание означает удаление самого верхнего элемента из стека. (Часто можно услышать третий термин, peeking, который означает просмотр/чтение самого верхнего элемента. )
Когда речь идет об очередях, обычно используют термины enqueueing и dequeueing, где первый означает добавление элемента в "задний конец" очереди, а второй - удаление элемента из "переднего конца" очереди.
Из этих определений следует, что стек (если представить его в голове) пространственно вертикален, а очередь горизонтальна. Другое различие заключается в том, что операции над стеком всегда происходят в одном и том же конце, в то время как операции над очередью происходят в противоположных концах.
Когда речь идет о связанных списках и двусторонних очередях (deques), также используются термины push и pop, напр. например, в STL C++, где есть такие операции, как push_front
, push_back
, pop_front
и pop_back
. Они просто подразумевают, что элементы могут быть добавлены или удалены с обоих концов.
Что касается того, почему pop называется именно так, а не pull (в отличие от push)... хороший вопрос.
Push/Pop первоначально относились к командам стека в asm land. Команда push помещает значение (регистр) в стек и обновляет указатель стека, а команда pop забирает значение из стека и уменьшает указатель. Здесь нет вставки, что означало бы существование какого-то смещения. Вот почему у вас также есть функции push/pop _front() и push/pop _back(). Они представляют собой статическое местоположение, из которого работает push/pop.
По крайней мере, в C ++ push и pop относятся только к таким структурам, как стеки и очереди, где место, в котором происходит операция, заложено в структуре данных. Для других контейнеров, таких как векторы и списки, у нас есть push_back, push_front, pop_back и т. Д. Для контейнеров, где мы действительно не знаем, где окажется элемент или откуда мы его будем читать, push и pop не используются в все.
Push и Pop - это обычные названия операций вставки и удаления элементов из структуры данных стека. Любые операции, которые следуют схеме "последний-первый-выход" (LIFO), обычно называются Push и Pop, но их можно называть как угодно.
Названия push и pop, вероятно, были придуманы только для того, чтобы отличить операции, которые можно выполнить над стеком, от операций, которые можно выполнить над списком. С тем же успехом их можно назвать add и remove, но они подразумевают, что вы можете добавить или удалить элемент в любом месте списка, а не только в его начале (или конце, если вы так считаете). Аналогично, enqueue и dequeue существуют потому, что push и pop подразумевают, что вставки и удаления происходят в одном и том же месте, а не в противоположных концах списка.
Если вам нужно техническое определение, то можно сказать, что push и pop - это O(1) операции, которые воздействуют на один и тот же конец списка по принципу LIFO (Last In, First Out).
Отправка - это просто добавление элемента в начало (или конец) коллекции. Поппинг - это удаление того же самого элемента.
В Java интерфейс List имеет добавление (0, элемент) и удаление (0). По сути, это параллели push (item) и pop ().
Однако push и pop и стеки интересны своим специфическим поведением, и поэтому многие из них имеют специализированные структуры данных, которые делают push и popping особенно эффективными.
Большая часть того, о чем вы спрашиваете, является условностью. Для очередей вы можете нажать или поставить в очередь. Вы увидите оба. Для стеков вы увидите добавление или нажатие. Для этого нет никаких жестких и быстрых правил. Если вы работаете на языке, который использует «push» как соглашение, используйте «push». Название имеет значение, но только для удобства использования и здравого смысла. Просто убедитесь, что ваше именование согласовано в рамках одного приложения или системы.
Названия push и pop используются, когда речь идет о стеках. Стеки работают по принципу "последний вошел - первый вышел" (LIFO). Таким образом, эти имена указывают на то, что pop вернет последнюю вытолкнутую вещь.
Термины push и pop обычно используются для стеков, а не для очередей или связанных списков. Стек - это структура данных типа LIFO (last-in-first-out); другими словами, первым удаляется элемент, который был добавлен последним. Push - это когда вы кладете новый элемент в стек, а pop - когда вы его снимаете.
Многие языки программирования позволяют писать код как угодно, включая использование имен push и pop для любых и всех структур данных, даже если на самом деле это не то, что вы делаете. Однако я бы не рекомендовал этого делать. Гораздо лучше использовать термины, которые используют другие, чтобы ваш код мог быть прочитан другими программистами. Кроме того, использование неправильной терминологии может затруднить получение работы и затруднить общение с другими программистами, если вы работаете над проектом (рабочим или с открытым исходным кодом).
Push и pop изначально использовались для обозначения операций со стеком, но неофициально эти термины часто используются для операций, связанных с добавлением/удалением элемента в конце любой линейной структуры данных, такой как стек, очередь, массив или связанный список.
Интуитивно мы думаем о стеках как о тех объектах, на которые мы можем помещать значения, верхнее значение которых - это то, что было отправлено последним, и что если мы вытолкнем стек, в который мы поместили значение, у нас есть исходный стек.
Эту интуицию можно представить как абстрактную алгебру , с 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" выбраны по соглашению.
Итак, я бы сказал, вы можете называть свои функции реализации как угодно , но называть их Push и Pop, если их действия реализуют эту алгебру.
Итак, можно определить стек с помощью формальной спецификации.Таким же образом можно определить любую другую структуру данных .
Жаль, что мы больше не делаем этого при документировании реального кода.