Как определяется push()ing и pop()ping?

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

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

13 ответов


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

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

Stack

Если вы поп-элементы с противоположного конца, то вы реализовали очередь-хотя обычно терминология "enqueue"и " dequeue". Это структура данных First-In-First-Out (FIFO):

Queue


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

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


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

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

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

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


, Почему поп называется так, а не тянуть (между пуш)... лучший вопрос.


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


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


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


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

Если вы хотите техническое определение, вы, вероятно, могли бы сказать, что push и поп являются O (1) операции, которые влияют на тот же конец списка в LIFO (последний в, первый из) образом.


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


Это просто добавление элемента в начало (или конец) коллекции. Popping удаляет тот же элемент.

в Java интерфейс списка имеет add(0, item) и remove(0). Это фактически параллели для push (item) и pop ().

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


большая часть того, что вы спрашиваете, - это конвенция. Для очередей вы можете нажать или enqueue. Вы увидите, как. Для стеков вы увидите add или push. Для этого нет жесткого и быстрого "правила". Если вы работаете на языке, который использует "push" как соглашение, используйте "push". Название имеет значение, но только для удобства использования и здравого смысла. Просто убедитесь, что ваше имя соответствует одному приложению или системе.


имена push и pop используются при разговоре о стеках. Стеки являются последними в первом выходе (LIFO). Таким образом, имена указывают на то, что 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, Top, Empty и т. д.

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

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

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

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

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

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

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


основная деятельность стога нажим и pop. Термин push используется для размещения некоторого элемента данных в стеке, а pop - для удаления некоторого элемента данных из стека.