Чтобы попытаться упростить описание стека и очереди, они оба являются динамическими цепочками информационных элементов, к которым можно получить доступ с одного конца цепочки, и единственная реальная разница между ними заключается в том, что:
при работе со стеком
- вы вставляете элементы на одном конце цепочки и
- вы извлекаете и / или удаляете элементы с одного и того же конца цепочки
пока с очередью
- вы вставляете элементы на одном конце цепочки и
- вы извлекаете / удаляете их с другого конца
ПРИМЕЧАНИЕ : я использую абстрактную формулировку извлечения / удаления в этом контексте, потому что бывают случаи, когда вы просто извлекаете элемент из цепочки или, в некотором смысле, просто читаете его или получаете доступ к его значению, но есть также случаи, когда вы удаляете элемент из цепочки. цепочка и, наконец, есть случаи, когда вы выполняете оба действия с одним и тем же вызовом.
Также слово «элемент» специально используется для того, чтобы максимально абстрагировать воображаемую цепочку и отделить ее от конкретных терминов языка программирования. Этим абстрактным информационным объектом, называемым элементом, может быть что угодно: указатель, значение, строка или символы, объект ... в зависимости от языка.
В большинстве случаев, хотя на самом деле это либо значение, либо ячейка памяти (то есть указатель). А остальные просто скрывают этот факт за языковым жаргоном <
Очередь может быть полезна, когда порядок элементов важен и должен быть точно таким же, как когда элементы впервые попали в вашу программу. Например, при обработке аудиопотока или при буферизации сетевых данных. Или когда вы выполняете какой-либо тип промежуточной обработки. Во всех этих случаях вам нужно, чтобы последовательность элементов выводилась в том же порядке, в каком они поступили в вашу программу, иначе информация может потерять смысл. Таким образом, вы можете разбить свою программу на часть, которая считывает данные с некоторого ввода, выполняет некоторую обработку и записывает их в очередь, а часть, которая извлекает данные из очереди, обрабатывает их и сохраняет их в другой очереди для дальнейшей обработки или передачи данных. ,
Стек может быть полезен, когда вам нужно временно сохранить элемент, который будет использоваться на непосредственном шаге (ах) вашей программы. Например, языки программирования обычно используют структуру стека для передачи переменных функциям. На самом деле они сохраняют (или помещают) аргументы функции в стек, а затем переходят к функции, где они удаляют и извлекают (или выталкивают) такое же количество элементов из стека. Таким образом, размер стека зависит от количества вложенных вызовов функций. Кроме того, после того, как функция была вызвана и завершила то, что она делала, она оставляет стек в том же состоянии, что и до того, как она была вызвана! Таким образом, любая функция может работать со стеком, игнорируя, как другие функции работают с ним.
Наконец, вы должны знать, что есть и другие термины, которые используются для обозначения аналогичных концепций. Например, стек можно назвать кучей. Существуют также гибридные версии этих концепций, например, двусторонняя очередь может вести себя одновременно как стек и как очередь, поскольку к ней могут обращаться одновременно оба конца. Кроме того, тот факт, что структура данных предоставляется вам в виде стека или очереди, не обязательно означает, что она реализована как таковая, существуют экземпляры, в которых структура данных может быть реализована как что угодно и предоставлена как конкретная структура данных просто потому, что ее можно заставить вести себя подобным образом. Другими словами, если вы предоставите метод push и pop для любой структуры данных, они волшебным образом станут стеками!