队列的实现
来源:互联网 发布:淘宝网那里卖包包拉链 编辑:程序博客网 时间:2024/06/06 06:31
实现Queue类
Java版本
使用链表结构作为实现的基础
Queue就是队列,也就是说元素可以从队列的末尾加入队列中,但若需要删除元素,就需要在队列的开头将元素删除,删除元素也叫作出列。
import java.util.Iterator;import java.util.NoSuchElementException;import java.util.Arrays;public class Queue<T> implements Iterable<T>{private int count;private Node<T> first;private Node<T> last;private static class Node<T>{private T elem;private Node<T> next;}public Queue() { }@SuppressWarnings("unchecked")public Queue( Queue<T> other ){Object[] array = new Object[other.size()];int i = 0;for( T elem : other )array[i++] = elem;T[] arrayCopy = ( T[] )Arrays.copyOf( array, array.length, Object[].class );for( T elem : arrayCopy )enqueue( elem );}public void enqueue( T elem ){Node<T> temp = new Node<>();temp.elem = elem;if( isEmpty() )first = temp;elselast.next = temp;last = temp;count++;}public T dequeue(){if( isEmpty() )throw new NoSuchElementException( "Queue underflow" );T elem = first.elem;first = first.next;if( isEmpty() )last = null;count--;return elem;}public T peek(){if( isEmpty() )throw new NoSuchElementException( "Queue underflow" );return first.elem;}public String toString(){StringBuilder s = new StringBuilder();s.append( "[ " );for( T elem : this )s.append( elem + " " );s.append( "]" );return s.toString();}public boolean isEmpty(){return first == null;}public int size(){return count;}private class ListIterator implements Iterator<T>{private Node<T> current = first;@Overridepublic boolean hasNext(){return current != null;}@Override public T next(){if( !hasNext() )throw new NoSuchElementException();T elem = current.elem;current = current.next;return elem;}@Overridepublic void remove(){throw new UnsupportedOperationException();}}@Overridepublic Iterator<T> iterator(){return new ListIterator();}}
使用环形数组作为实现的基础
在使用数组实现队列时,通常有一个问题,就是在队列的头部删除元素时,由于数组中的元素是没有办法移动的,这就造成了在删除元素之后,数组头部出现了未填充的状态,造成了不必要的存储空间的浪费。所谓的环形数组,其实就是使用一般的数组,只不过若元素加在数组的末尾,这时要是数组末尾没有空余的位置,那么就可以将新的元素填充到数组开头的没有被利用的部分,要是整个数组都填满了元素,那么数组就会动态地增长。
import java.util.Iterator;import java.util.NoSuchElementException;public class ResizingArrayQueue<T> implements Iterable<T>{private T[] data;private int count;private int first;private int last;@SuppressWarnings("unchecked")public ResizingArrayQueue(){data = ( T[] )new Object[2];}public boolean isEmpty(){return count == 0;}public int size(){return count;}@SuppressWarnings("unchecked")private void resize( int newSize ){assert newSize >= count;T[] temp = ( T[] )new Object[newSize];for( int i = 0; i < count; i++ )temp[i] = data[ ( i + first ) % data.length];data = temp;first = 0;last = count;}public void enqueue( T elem ){if( count == data.length )resize( count * 2 );data[last] = elem;last = ( last + 1 ) % data.length;count++;}public T dequeue(){if( isEmpty() )throw new NoSuchElementException( "Queue underflow" );T elem = data[first];data[first] = null;first = ( first + 1 ) % data.length;count--;if( count > 0 && count == data.length / 4 )resize( data.length / 2 );return elem;}public T peek(){if( isEmpty() )throw new NoSuchElementException( "Queue underflow" );return data[first];}public Iterator<T> iterator(){return new ArrayIterator();}private class ArrayIterator implements Iterator<T>{private int current = first;@Overridepublic boolean hasNext(){return current != last;}@Overridepublic T next(){if( !hasNext() )throw new NoSuchElementException();T elem = data[current];current = ( current + 1 ) % data.length;return elem;}@Overridepublic void remove(){throw new UnsupportedOperationException();}}}
C++版本
待续...
0 0
- 队列的实现:顺序队列
- 队列的实现:链式队列
- 队列----循环队列的实现
- 队列实现 队列的链式结构实现
- 堆栈,队列的实现
- 链队列的实现
- 队列的实现
- 队列的实现
- java 实现的队列
- 工作队列的实现
- 工作队列的实现
- 用链表实现的队列
- 队列的实现
- 队列的实现
- 队列的实现
- 队列的数组实现
- 循环队列的实现
- 数据结构 队列的实现
- leetcode 虐我篇之(四)Remove Duplicates from Sorted List II
- 为什么呢????没有封号啊
- Prevent the user click a button twice
- 浅析UML之组织结构图
- android项目解刨之时间轴
- 队列的实现
- cocos2d-x-3.2版本win7环境中的搭建
- ReportStudio入门教程(七十五) - 计算项的运算顺序
- 修改登陆密码
- 还算可以的哦0000000000000000
- Android学习——在Android中使用OpenCV的第一个程序
- LeetCode-Single Number
- 浅析UML之配置图
- Java知识零碎