Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Очередь, алгоритмы основных операций↑ ⇐ ПредыдущаяСтр 3 из 3 Содержание книги
Поиск на нашем сайте
Еще одной базовой структурой данных является очередь. Эта структура данных аналогична стеку, так как очередь объединяет объекты, работа с которыми — добавление и удаление — осуществляется по принципу FIFO (first-in first-out) (первым пришел — первым ушел). Добавление объектов в очередь может осуществляться в любое время, однако удаленным может быть лишь объект, который был добавлен первым. Говорят, что элементы добавляются в очередь с конца, а удаляются с начала. Можно сравнить очередь данных с очередью людей в любом магазине: они встают в очередь с конца, а тот, кто был первым в очереди, обслуживается. Очередь S является абстрактным типом данных, который поддерживает две основные функции: enqueue (о): помещает объект о в конец очереди. Вход: объект; Выход: нет. dequeue (): производит удаление и возвращает объект из начала очереди; если очередь пуста, выдается сообщение об ошибке. Вход: нет; Выход: объект. Кроме того, очередь выполняет следующие дополнительные функции: size (): возвращает число объектов в очереди. Вход: нет; Выход: целое число. isEmpty (): возвращает логическое значение, подтверждающее, что очередь пуста. Вход: нет; Выход: логическое значение. front (): возвращает первый объект в очереди, не удаляя его; если очередь пуста, выдается сообщение об ошибке. Вход: нет; Выход: объект. Рассмотрим реализацию очереди с помощью массива Q для хранения элементов очереди, длина которого N, например, N = 1000. Так как основной характеристикой очереди является добавление и удаление объектов по принципу FIFO, необходимо определить способ наблюдения за началом и концом очереди. Для того чтобы избежать перемещения объектов в Q, применим две переменные f и r • f является индексом ячейки Q, в которой хранится первый элемент очереди (кандидат на удаление при выполнении метода dequeue) при условии, что очередь не является пустой (в этом случае f= r). • r является индексом следующей доступной ячейки массива Q. Изначально присваиваем f=г=0, что означает пустую очередь. Теперь, после удаления элемента из начала очереди просто увеличиваем значение f на 1 для получения индекса следующей ячейки массива. Если добавляем новый элемент, то увеличиваем значение r на 1 для получения индекса следующей доступной ячейки массива Q. Для обеспечения возможности использования всего массива Q предположим, что индексы f и г «охватывают» конечные точки массива Q. В этом случае Q рассматривается как «круговой» массив, который продолжается от Q[0] до Q[N- 1], а затем снова возвращается к Q[0]. Реализация подобного представления Q довольно проста. При каждом увеличении значения f и r на 1 необходимо записать эту операцию в виде (f + 1) mod N или (r + 1) mod N соответственно, где mod N обозначает операцию деления по модулю, которая вычисляется путем получения остатка от деления. Размер очереди вычисляется с помощью выражения (N-f+r) mod N, которое позволяет получить правильный результат как в случае нормальной конфигурации, где f<г, так и при «круговой» конфигурации, где r<f. Алгоритмы функций: size(): 1. Возврат (N - f+ r) mod N isEmpty(): 1. Возврат (f = r) front(): 1. Возврат Q[f] dequeue(): 1. temp =Q[f] 2. Q[f]=0 3.f= (f+ 1) mod N 4. Возврат temp enqueue(o): 1. О[t]= о r =(r + 1) mod N Реализация очереди на основе однонаправленного связного списка Очередь также можно реализовать на основе однонаправленного связного списка. Для наибольшей эффективности поместим начало очереди, где можно только удалять элементы, в начало списка, а конец очереди, где можно добавлять элементы, — в хвост списка. Не следует забывать о необходимости сохранения ссылок на начальный и конечный узлы списка. class Que { private Node first, last; private int size; public int Size { get { return size; } set { size = value; } } public Node First { get { return first; } set { first = value; } } public Node Last { get { return last; } set { last = value; } } public Que() { First = null; Last = null; } public void enqueue(int obj) { Node node = new Node(obj); node.Next=null; // узел будет новым концевым узлом if (Size == 0) First = node; //особый случай, если до этого очередь была пуста else Last.Next=node; // добавляет узел в конец списка Last = node; // перенаправляет ссылку к концевому узлу Size++; } public int dequeue() { int obj; obj = First.Data; First = First.Next; Size--; if (Size == 0) Last = null; // сейчас очередь пуста return obj; } public int siz() { return Size; } public bool isEmpty() { if (Size == 0) return true; else return false; } public Node front() { return First; } } Классы коллекций
Класс ArrayList и его методы
Очень часто случается так, что размер массива неизвестен заранее. Именно в таких случаях удобно использовать класс ArrayList – динамический одномерный массив, то есть массив, позволяющий динамически менять свой размер. ArrayList реализует абстрактный тип «список». Конструктор ArrayList() инициализирует новый пустой экземпляр класса ArrayList. Реальное количество элементов, хранящихся в данный момент в ArrayList, можно узнать из свойства Count. Метод Add(объект) добавляет объект в конец списка ArrayList. Метод BinarySearch (объект) выполняет поиск элемента по всему отсортированному списку ArrayList и возвращает индекс (с нуля) этого элемента или -1, если элемента нет. Метод Clear() удаляет все объекты из коллекции ArrayList Метод Contains(объект) определяет, входит ли элемент в состав коллекции ArrayList. Метод Insert (индекс, объект) вставляет элемент в список ArrayList по указанному нндексу.Метод Remove(объект) удаляет первое вхождение указанного объекта из списка ArrayList.Метод RemoveAt(индекс) удаляет элемент с указанным индексом из списка ArrayList.В условиях примера с двумя классами вначале создается пустая коллекция: Global.A1 = new ArrayList(); Добавление элемента в коллекцию: if (radioButton1.Checked){ Global.A1.Add(new stud(Global.st1.name,Global.st1.age, Global.st1.ball, Global.st1.group)); } else {Global.A1.Add(newgrad_stud(Global.st1.name,Global.st1.age, Global.st1.ball,Global.st1.group, Global.st1.place)); } Вывод элементов коллекции: listBox1.Items.Clear(); foreach (stud A0 in Global.A1){ listBox1.Items.Add(A0.info()); } Класс Stack и его методы
Этот класс представляет собой коллекцию объектов типа "последним пришел — первым вышел" (LIFO). Конструктор Stack() инициализирует новый пустой экземпляр класса Stack. Реальное количество элементов, хранящихся в данный момент в Stack, можно узнать из свойства Count. Метод Contains(объект) определяет, входит ли элемент в состав коллекции Stack. Метод Clear() удаляет все объекты из коллекции Stack. Метод Peek()возвращает верхний объект стека Stack, но не удаляет его.Метод Pop() удаляет и возвращает верхний объект стека Stack.Метод Push(объект) вставляет объект как верхний элемент стека Stack.Пример применения методов: using System.Collections;public class SamplesStack { public static void Main() {// Создание и инициализация нового стекаStack myStack = new Stack();myStack.Push("The");myStack.Push("quick");myStack.Push("brown");myStack.Push("fox");// Вывод содержимого стека с конца Console.Write("Содержимое стека:");PrintValues(myStack, '\t');// Удаление элемента из стекаConsole.WriteLine("(Удаленный)\t\t{0}", myStack.Pop());// Вывод содержимого стека Console.Write(" Содержимое стека:");PrintValues(myStack, '\t');// Просмотр элемента в вершине стека.Console.WriteLine("(Верхний элемент)\t\t{0}", myStack.Peek());}public static void PrintValues(Stack myCollection,char mySeparator) { foreach (Object obj in myCollection) Console.Write("{0}{1}", mySeparator, obj); Console.WriteLine();} }Класс Queue и его методы
Этот класс представляет коллекцию объектов, основанную на принципе "первым поступил — первым обслужен". Конструктор Queue() инициализирует новый пустой экземпляр класса Queue. Реальное количество элементов, хранящихся в данный момент в Queue, можно узнать из свойства Count. Метод Contains(объект) определяет, входит ли элемент в состав коллекции Queue. Метод Clear() удаляет все объекты из коллекции Queue. Метод Dequeue() удаляет и возвращает объект, находящийся в начале коллекции Queue. Метод Enqueue(объект) добавляет объект в конец коллекции Queue.Метод Peek() возвращает объект, находящийся в начале коллекции Queue, но не удаляет его. В следующем примере показано, как добавить элементы в коллекцию Queue, удалить элементы из коллекции Queue или просмотреть элемент, находящийся в начале коллекции Queue. using System.Collections;public class SamplesQueue {public static void Main() {// Создание и инициализация новой очереди Queue myQ = new Queue(); myQ.Enqueue("The"); myQ.Enqueue("quick"); myQ.Enqueue("brown"); myQ.Enqueue("fox");// Вывод очереди в порядке поступления Console.Write("Очередь:"); PrintValues(myQ); // Удаление первого элемента очередиConsole.WriteLine("(Удален)\t{0}", myQ.Dequeue());// Вывод очереди в порядке поступления Console.Write(" Очередь:"); PrintValues(myQ);// Вывод первого элемента без его удаления Console.WriteLine("(Первый элемент) \t{0}", myQ.Peek()); } public static void PrintValues(Queue myCollection) { foreach (Object obj in myCollection) Console.Write(" {0}", obj);Console.WriteLine(); }}
Класс List и его методы Класс List – это коллекция, элементами которой являются экземпляры класса. Поддерживает методы для поиска по списку, выполнения сортировки и других операций со списками. Объявление списка имеет вид: List<тип входящего объекта> имя = new List< тип входящего объекта>(); У класса имеются свойствоCount - Число элементов, которое фактически содержится в коллекции. Полезные методы класса List перечислены в табл. 12. Таблица 12 Некоторые методы класса List
m(n => (long)n)));
|
||||||||||||||||||||||
Последнее изменение этой страницы: 2016-09-19; просмотров: 219; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.135.184.136 (0.009 с.) |