Стек и очередь:
Обычно он используется в качестве инструмента для программистов, чтобы помочь в концепции алгоритмов, с коротким жизненным циклом и создается только во время выполнения;
Доступ ограничен, и в определенный момент можно прочитать или удалить только один данные;
Это абстрактная структура с внутренним механизмом реализации, который невидим для пользователей, такой как использование массивов и связанных списков для реализации стека.
Имитировать структуру стека
В то же время доступен только к одному данным, и временная сложность последующей первой, как для Stack, так и для OUT O (1), то есть не зависит от количества элементов данных в стеке. Операция относительно быстрая, используя массив в качестве структуры хранения стека
стеки открытых классов <t> {private int max; Частный T [] ary; частный int top; // указатель, подход к верхнему элементу стека Public Stacks (int size) {this.max = size; ary = (t []) новый объект [max]; top = -1; } // Stack public void push (t data) {if (! Isfull ()) ary [++ top] = data; } // Stack public t pop () {if (isempty ()) {return null; } return ary [top--]; } // Просмотреть верхнюю часть стека public t peek () {return ary [top]; } // -это стек пустой общедоступный логический isempty () {return top == -1; } // - это стек полной общедоступной логины isfull () {return top == max - 1; } // size public int size () {return top + 1; } public static void main (string [] args) {Stacks <Integer> Stack = new Stacks <Integer> (3); for (int i = 0; i <5; i ++) {Stack.push (i); System.out.println ("size:" + stack.size ()); } for (int i = 0; i <5; i ++) {integer peek = stack.peek (); System.out.println ("peek:" + peek); System.out.println ("size:" + stack.size ()); } for (int i = 0; i <5; i ++) {integer pop = stack.pop (); System.out.println ("pop:" + pop); System.out.println ("size:" + stack.size ()); } System.out.println ("----"); for (int i = 5; i> 0; i--) {Stack.push (i); System.out.println ("size:" + stack.size ()); } for (int i = 5; i> 0; i--) {integer peek = stack.peek (); System.out.println ("peek:" + peek); System.out.println ("size:" + stack.size ()); } for (int i = 5; i> 0; i--) {integer pop = Stack.pop (); System.out.println ("pop:" + pop); System.out.println ("size:" + stack.size ()); }}} В приведенном выше примере существует максимальное регулирование, потому что массив должен быть размером. Если вы хотите не иметь ограничений, вы можете использовать другие структуры для хранения, и, конечно, вы также можете новый массив новой длины.
Пример, используйте LinkedList Storage для реализации стека
открытый класс Stackss <t> {private linkedlist <t> dataS; public Stackss () {datas = new LinkedList <t> (); } // Поместите стек public void push (t data) {datas.addlast (data); } // Поместите стек public t pop () {return datas.removelast (); } // Проверьте верхнюю часть стека public t peek () {return data.getlast (); } // Является ли стек пустым общедоступным логическим iSempty () {return data.isempty (); } // size public int size () {return data.size (); } public static void main (string [] args) {Stacks <Integer> Stack = new Stacks <Integer> (3); for (int i = 0; i <5; i ++) {Stack.push (i); System.out.println ("size:" + stack.size ()); } for (int i = 0; i <5; i ++) {integer peek = stack.peek (); System.out.println ("peek:" + peek); System.out.println ("size:" + stack.size ()); } for (int i = 0; i <5; i ++) {integer pop = stack.pop (); System.out.println ("pop:" + pop); System.out.println ("size:" + stack.size ()); } System.out.println ("----"); for (int i = 5; i> 0; i--) {Stack.push (i); System.out.println ("size:" + stack.size ()); } for (int i = 5; i> 0; i--) {Stack.push (i); System.out.println ("size:" + stack.size ()); } for (int i = 5; i> 0; i--) {integer peek = stack.peek (); System.out.println ("peek:" + peek); System.out.println ("size:" + stack.size ()); } for (int i = 5; i> 0; i--) {integer pop = Stack.pop (); System.out.println ("pop:" + pop); System.out.println ("size:" + stack.size ()); }}}Пример, обратный порядок слов, используя структуру StatCK
открытый класс wordRevers {public static void main (string [] args) {reample ("co., ltd."); } static void Reacht (String Word) {if (Word == null) return; Stackss <символ> стек = новые стеки <символ> (); char [] chararray = word.tochararray (); int len = chararray.length; for (int i = 0; i <len; i ++) {Stack.push (chararray [i]); } StringBuilder sb = new StringBuilder (); while (! Stack.isempty ()) {sb.append (stack.pop ()); } System.out.println ("После инверсии:" + sb.tostring ()); }}Печать:
После отмены: в социальном стиле
Очередь моделирования (общая очередь, двойная очередь, приоритетная очередь)
очередь:
Сначала в первую очередь разбирайтесь с проблемами очереди. Первая очередь, первый процесс, первый ряд, второй ряд и т. Д. Предыдущий процесс завершен, а временная сложность операций вставки и удаления - O (1). Вставьте сзади и удалите двойную очередь спереди:
То есть вы можете вставить и удалять на обоих концах очереди: вставка, вставка, удаление, снятие снятия
Функции, содержащие стек и очереди. Если вы удалите вставку и удаляет, он будет таким же, как стек; Если вы удалите вставку и снятие снятия, он будет такой же, как в очереди. Как правило, частота использования низкая, а временная сложность O (1)
Приоритетная очередь:
Поддерживать внутреннюю последовательность, отсортированную по приоритету. При вставке вам нужно сравнить и найти позицию вставки, сложности времени O (n), удалить O (1)
/** Сначала очередь сначала, указатель указывает позицию вставки, а указатель указывает позицию избираемого элемента данных*/ public class queueq <t> {private int max; Частный T [] ary; Частный фронт; // Глава команды указывает позицию элемента данных, выводимый в частной задней задней панели; // хвост команды указывает позицию элемента данных, вставленного частными int nitems; // фактическое количество элементов данных public queueq (int size) {this.max = size; ary = (t []) новый объект [max]; Фронт = 0; задний = -1; nitems = 0; } // Вставьте хвост очереди public void вставки (t t) {if (buld == max - 1) {// он достиг конца фактической очереди, начните с начала, задний = -1; } ary [++ задний] = t; nitems ++; } // Удалить голову команды public t remove () {t temp = ary [Front ++]; if (front == max) {// очередь достигла конца, начало с самого начала, начало с самого начала, начните с самого начала, начинайте с самого начала, 0; } nitems--; вернуть температуру; } // Посмотреть главу команды Public t Peek () {return ary [Front]; } public boolean isempty () {return nitems == 0; } public boolean isfull () {return nitems == max; } public int size () {return nitems; } public static void main (string [] args) {queueq <Integer> queue = new queueq <integer> (3); for (int i = 0; i <5; i ++) {queue.insert (i); System.out.println ("size:" + queue.size ()); } for (int i = 0; i <5; i ++) {integer peek = queue.peek (); System.out.println ("peek:" + peek); System.out.println ("size:" + queue.size ()); } for (int i = 0; i <5; i ++) {integer remove = queue.remove (); System.out.println ("удалить:" + remove); System.out.println ("size:" + queue.size ()); } System.out.println ("----"); for (int i = 5; i> 0; i--) {queue.insert (i); System.out.println ("size:" + queue.size ()); } for (int i = 5; i> 0; i--) {integer peek = queue.peek (); System.out.println ("peek:" + peek); System.out.println ("size:" + queue.size ()); } for (int i = 5; i> 0; i--) {integer remove = queue.remove (); System.out.println ("удалить:" + remove); System.out.println ("size:" + queue.size ()); }}} /** Двойная очередь <span style = "Белое пространство: pre"> </span> вставьте и удаляйте на обоих концах*/public class queueqt <t> {private linkedlist <t> list; public queueqt () {list = new LinkedList <t> (); } // Вставьте главу queue public void insertleft (t t) {list.addfirst (t); } // Вставьте хвост очереди public void insertright (t t) {list.addlast (t); } // Удалить головную очередь public t removeleft () {return list.removefirst (); } // Удалить конец команды Public T Removeright () {return List.Removelast (); } // Посмотреть главу команды public t peekleft () {return list.getFirst (); } // Посмотреть конец команды public t peekright () {return list.getlast (); } public boolean isempty () {return list.isempty (); } public int size () {return list.size (); }} /** Приоритетная очередь сортируется по приоритету, и это упорядоченная очередь*/ public class queueqp {private int max; частный int [] ary; частные int nitems; // Фактическое количество элементов данных public queueqp (int size) {this.max = size; ary = new int [max]; nitems = 0; } // вставить конец очереди public void insert (int t) {int j; if (nitems == 0) {ary [nitems ++] = t; } else {for (j = nitems-1; j> = 0; j--) {if (t> ary [j]) {ary [j + 1] = ary [j]; // Присвоение предыдущего на следующий эквивалентен использованию сортировки вставки. Заданная последовательность первоначально упорядочена, поэтому эффективность o (n)} else {break; }} ary [j + 1] = t; nitems ++; } System.out.println (Arrays.toString (ary)); } // Удалить голову команды public int remove () {return ary [-nitems]; // Удалить небольшой приоритет} // Просмотреть самый низкий приоритет команды public int peekmin () {return ary [nitems - 1]; } public boolean isempty () {return nitems == 0; } public boolean isfull () {return nitems == max; } public int size () {return nitems; } public static void main (string [] args) {queueqp queue = new queueqp (3); queue.insert (1); queue.insert (2); queue.insert (3); int удалить = queue.remove (); System.out.println ("удалить:" + remove); }}