Принцип реализации очереди Java
Слово «очередь» - это то, что британцы называют «очередью». «Потолок в линии» в Великобритании означает стоять подряд. В информатике очередь - это структура данных, которая немного похожа на стек, за исключением того, что первый элемент данных, вставленные в очередь, будет сначала удален, а в стеке сначала удаляется последний элемент данных. Очередь работает как ряды людей, стоящих перед кинотеатром: первый человек, выйдя в аффилированный, прибудет во главу команды, чтобы купить билеты. Последний человек, который очереди, может купить билеты.
Очерки также используются в качестве инструментов для программистов, таких как стеки. Его также можно использовать для имитации реальных средств, таких как моделирование людей, ожидающих в банке, самолеты, ожидающие взлета, или пакеты в Интернете ожидают передачи.
В компьютерной операционной системе различные очереди работают тихо. Задача печати ждет печати в очереди печати. При вводе на клавиатуре также есть очередь, в которой хранится печатание. Точно так же, если ключ нажаты с использованием текстового процессора, и компьютер должен сделать что -то еще временно, контент постукивания не будет потерян, и он будет ждать в очереди, пока текстовый процессор не найдет время, чтобы прочитать его. Очередь используется для обеспечения того, чтобы порядок печати не был изменен при обработке.
Основные операции очередей
Две основные операции очереди вводят (вставка) элемент данных, то есть помещение одного элемента данных в хвост очереди, а другой удаляет (удаляет) элемент данных, то есть удаление элемента данных в главе команды. Это похоже на то, что любители фильмов стоят в очереди до конца линии, когда они стоят в очереди, чтобы купить билеты, а затем прибыть в голову линии, а затем оставить очередь.
Наименование методов для вставки и удаления элементов данных в стек очень стандартное, называемое push и pop. Метод очереди до сих пор не был назван стандартизированным. «Вставка» можно назвать путем, добавлять или энке, а «удалить» можно назвать удалением, получить или deque. Конец элемента данных вставки также можно вызвать обратно, хвост или конец. Глава команды, которая удаляет элемент данных, также можно назвать Head. Вставьте, удалите, спереди и сзади будут использоваться ниже.
Вставьте значение в хвост очереди, и хвост стрелки очереди добавляется, чтобы указывать на новый элемент данных.
После удаления элемента данных глава команды добавляется одним. Обычно при внедрении очереди удаленный элемент данных будет сохранен в памяти, но к ней нельзя получить доступ, потому что голова очереди была перемещена на следующую позицию.
В отличие от случая в стеке, элементы данных в очереди не всегда начинаются с подписки 0 массива. После удаления некоторых элементов данных указатель заголовка указывает на более высокую позицию индекса.
Операция представления возвращает значение элемента данных заголовка, но не удаляет элемент данных из команды.
Если вы хотите удалить элемент данных из пустой очереди или вставить элемент данных в полную очередь, приложение заставит сообщение об ошибке.
Целевая очередь
Когда новый элемент данных вставлен в очередь, стрелка задней части команды движется вверх к большому положению подписания массива. При удалении элементов данных хвост переднего указателя очереди также движется вверх. Этот дизайн может противоречить прямому наблюдению людей, потому что, когда люди стоят в очереди на билеты на кино, очередь всегда движется вперед, и после того, как человек перед ними покупает билет и покидает очередь, остальные движутся вперед. После удаления элемента данных в очереди на компьютере вы также можете переместить все остальные элементы данных вперед, но это очень эффективно. Вместо этого мы держим все элементы данных в положении одинаковых через движение головы и хвостовых указателей очереди.
Проблема с этим дизайном заключается в том, что указатель хвоста быстро перейдет к концу массива. Несмотря на то, что в начале массива есть пустой элемент данных, который является местоположением удаленного элемента данных, но, поскольку указатель хвоста больше не может двигаться назад, новые элементы данных не могут быть вставлены. Что я должен делать?
Обработка лечения
Чтобы избежать проблемы, когда очередь была недовольна, но не в состоянии вставлять новые элементы данных, указатели головы и хвоста могут быть завернуты в начало массива. Это очередь петли (иногда также называется «буферным кольцом»).
Процесс обертывания указателя: вставьте достаточно элементов данных в очередь, чтобы сделать точку указателя хвоста до последнего конца массива. Удалите еще несколько элементов данных на передней части массива. Теперь вставьте новый элемент данных. Вы увидите, что указатель хвоста будет изменен от конца на исходную позицию. Новые элементы данных будут вставлены в это место.
Вставьте больше элементов данных. Указатель хвоста движется вверх, как и ожидалось. Обратите внимание, что после того, как указатель хвоста перемотает, теперь он находится под указателем головы, что меняет начальное положение. Это можно назвать «сломанной последовательности»: элементы данных в очереди присутствуют в двух разных последовательностях в массиве.
После удаления достаточно элементов данных глава команды также оборачивается. В это время указатель очереди возвращается в состояние позиции в начальном времени выполнения, а указатель головы находится под указателем хвоста. Элементы данных также восстанавливаются в одной непрерывной последовательности.
Код Java для очередей
Программа queue.java создает класс очередей, который имеет методы insert (), rement (), peek (), isempty () и size ().
Стек и очередь упаковки;
Классовая очередь {private int maxsize; частный длинный [] Quearray; Частный фронт; частный int задний; частные int nitems; публичная очередь (int s) {maxSize = s; Quearray = new Long [maxSize]; Фронт = 0; задний = -1; nitems = 0; } public void insert (long j) {if (buld == maxSize-1) задний = -1; Quearray [++ задний] = j; nitems ++; } public long remove () {long temp = Quearray [Front ++]; if (front == maxsize) front = 0; Нитья--; вернуть температуру; } public long peekfront () {return Quearray [Front]; } public boolean isempty () {return (nitems == 0); } public boolean iffull () {return (nitems == maxsize); } public int size () {return nitems; }}Класс очередей, реализованный программой, имеет не только передние (головные) и задние (глава команды) поля, но и количество текущих элементов данных в очереди: NITEMS.
Предварительным условием для работы метода insert () является то, что очередь недовольна. Этот метод не отображается в main (), но метод insert () обычно должен быть вызван сначала, а затем метод isfull () следует вызывать после возвращения false. (Более общий подход состоит в том, чтобы добавить суждение в метод insert (), чтобы проверить, заполнена ли очередь. Если элемент данных вставлен в полную очередь, будет брошено исключение.)
Вообще говоря, операция вставки состоит в том, чтобы добавить задний (указатель командного хвоста) и вставить новые данные в положении, указанном по указателю хвоста. Однако, когда задний указатель указывает на верхнюю часть массива, то есть в позицию MaxSize-1, он должен быть нанесен обратно в нижнюю часть массива, прежде чем вставить элемент данных. Операция обмотки устанавливает заднюю часть на -1, поэтому, когда задняя часть добавлена 1, она равна 0, что является значением индекса в нижней части массива, и, наконец, добавляется NITEM.
Предварительным условием для работы метода remove () является то, что очередь не является пустой. Прежде чем вызывать этот метод, вы должны вызвать метод isempty (), чтобы убедиться, что очередь не является пустой, или добавить этот механизм проверки ошибки в метод remove ().
Операция удаления всегда получает значение элемента данных заголовка из переднего указателя, а затем добавляет передний. Однако, если вы сделаете это, что значение фронта превышает верхнюю часть массива, фронт должен вернуться к позиции, где подписка массива составляет 0. При выполнении этого теста возвратное значение временно сохраняется. Наконец, NITEM уменьшается на один.
Метод Peek () прост и прост в понимании: он возвращает значение элемента данных, указанного в переднем указателе. Некоторые реализации очередей также позволяют просматривать значение элемента данных на концом очереди; Например, эти методы можно назвать PeekFront (), peekRear () или rave Front () и Bult ().
Реализация методов isempty (), isfull () и size () все полагается на поле Nitems, которое возвращает, равно ли Nitems равен 0, будь то MaxSize или возвращает свое собственное значение.
Включая поля подсчета элементов данных в классе очередей добавят небольшую дополнительную операцию в методы insert () и remove (), поскольку методы insert () и rement () должны увеличить и уменьшить значение этой переменной соответственно. Это не может быть дополнительным накладным расходом, но если вы имеете дело с большим количеством вставки и удаления операций, это может повлиять на производительность.
Потому что некоторые реализации очередей не используют поля подсчета элементов данных, а используйте переднюю и заднюю часть, чтобы вычислить, является ли очередь пустой или полной, а также количество элементов данных. Если вы сделаете это, процедуры isempty (), iffull () и size () будут довольно сложными, потому что, как упоминалось ранее, последовательность элементов данных либо свернута в два сегмента, либо непрерывный сегмент.
И возникла странная проблема. Когда очередь заполнена, передние и задние указатели занимают определенную позицию, но когда очередь пуста, может также появиться то же положение положения. Таким образом, в то же время очередь может показаться полной или пустой. Решением этой проблемы является: сделать емкость массива на один больше, чем максимальное количество элементов данных в очереди.
Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!