概念:队列是一种运算受限的线性表,它先进先出
队列的操作有:
构造队列、销毁队列、清空队列、计算队列长度、取队头元素、元素入队和元素出对
代码:
package com.alg.queue;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.NoSuchElementException;
//用数组实现队列
//队列是一种运算受限的线性表,它先进先出
//队列的操作有:构造队列、销毁队列、清空队列、计算队列长度、取队头元素、元素入队和元素出对
//Iterable为对for循环的支持
public class Queue<T> implements Iterable<T>
{
protected Object[] elementData = null;
// 默认数组大小
private static final int DEFAULT_SIZE = 10;
// 数组的每次增长幅度
protected int capacityIncrement;
// 操作数
private int modCount;
// 统计数组内保存的元素数量
private int elementCount;
public Queue()
{
this(DEFAULT_SIZE, 0);
}
public Queue(int capacity)
{
this(capacity, 0);
}
public Queue(int capacity, int capacityIncrment)
{
elementData = newElementArray(capacity);
elementCount = 0;
this.capacityIncrement = capacityIncrment;
}
// 清空队
public void clear()
{
for (int i = 0; i < elementCount; i++)
{
elementData[i] = null;
}
modCount++;
elementCount = 0;
}
// 取队头元素
@SuppressWarnings("unchecked")
public T peek()
{
T t = null;
if (elementCount > 0)
{
t = (T) elementData[0];
}
return t;
}
// 出队
@SuppressWarnings("unchecked")
public T dequeue()
{
T t = null;
if (elementCount > 0)
{
t = (T) elementData[0];
System.arraycopy(elementData, 1, elementData, 0, --elementCount);
modCount++;
}
return t;
}
// 入队
public void enqueue(T object)
{
// 栈满,增加栈容量
if (elementCount == elementData.length)
{
growByOne();
}
elementData[elementCount++] = object;
modCount++;
}
@SuppressWarnings( {"unused", "unchecked"})
private T[] newElementArray(int size)
{
return (T[]) new Object[size];
} // 如果从节省空间角度考虑capacityIncrement最好设置
private void growByOne()
{
int adding = 0;
// 没有设置增量的情况
if (capacityIncrement <= 0)
{ // 如果elementData长度为0,就加1,否则就增加elementData.length的一倍
if ((adding = elementData.length) == 0)
{
adding = 1;
}
}
else
{
adding = capacityIncrement;
}
T[] newData = newElementArray(elementData.length + adding);
System.arraycopy(elementData, 0, newData, 0, elementCount);
elementData = newData;
}
@SuppressWarnings("unchecked")
public synchronized T remove(int location)
{
if (location < elementCount)
{
T result = (T) elementData[location];
elementCount--;
int size = elementCount - location;
// 把location + 1到最后整个拷贝到从location开始到最后
if (size > 0)
{
System.arraycopy(elementData, location + 1, elementData, location, size);
}
// 因为中间的某个删除的位置被覆盖,所以需要把最后一位直空
elementData[elementCount] = null;
modCount++;
return result;
}
throw new ArrayIndexOutOfBoundsException(location);
}
// 增加了对for循环的支持
public Iterator<T> iterator()
{
return new SimpleIterator();
}
@SuppressWarnings("unchecked")
public synchronized T elementAt(int location)
{
if (location < elementCount)
{
return (T) elementData[location];
}
throw new ArrayIndexOutOfBoundsException(location);
}
public int size()
{
return elementCount;
}
// 简单了实现迭代器
private class SimpleIterator implements Iterator<T>
{
int pos = -1;
int expectedModCount;
int lastPosition = -1;
SimpleIterator()
{
super();
expectedModCount = modCount;
}
public boolean hasNext()
{
return pos + 1 < size();
}
public T next()
{
if (expectedModCount == modCount)
{
try
{
T result = elementAt(pos + 1);
lastPosition = ++pos;
return result;
}
catch (IndexOutOfBoundsException e)
{
throw new NoSuchElementException();
}
}
throw new ConcurrentModificationException();
}
public void remove()
{
if (this.lastPosition == -1)
{
throw new IllegalStateException();
}
if (expectedModCount != modCount)
{
throw new ConcurrentModificationException();
}
try
{
Queue.this.remove(lastPosition);
}
catch (IndexOutOfBoundsException e)
{
throw new ConcurrentModificationException();
}
expectedModCount = modCount;
if (pos == lastPosition)
{
pos--;
}
lastPosition = -1;
}
}
}
package com.alg.queue;
public class QueueMain
{
public static void main(String[] args)
{
Queue<String> queue = new Queue<String>();
queue.enqueue("a");
queue.enqueue("b");
queue.enqueue("c");
queue.enqueue("d");
queue.enqueue("e");
System.out.print("入队:");
for (String q : queue)
{
System.out.print(q + " ");
}
System.out.println("出队元素:" + queue.dequeue());
System.out.print("出队后:");
for (String q : queue)
{
System.out.print(q + " ");
}
System.out.println("取队头元素:" + queue.peek());
queue.clear();
System.out.println("清空队:" + queue.size());
}
}
运行结果:
入队:a b c d e 出队元素:a
出队后:b c d e 取队头元素:b
清空队:0
分享到:
相关推荐
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
数据结构-栈与队列,链表,递归,简单排序到高级排序的算法的详细笔记,本人根据视频学习进行的数据结构记录。适合入门算法学习初级篇
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
数据结构学习资料分享 内容概览: 本次分享包涵了大学计算机相关专业必学的“数据结构”课程的一系列学习资料。主要包括: 算法代码:我们提供了多种数据结构的实现代码,包括数组、链表、栈、队列、树、图等。...
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
NULL 博文链接:https://yuan.iteye.com/blog/305590
算法与数据结构涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
数据结构学习资料分享 内容概览: 本次分享包涵了大学计算机相关专业必学的“数据结构”课程的一系列学习资料。主要包括: 算法代码:我们提供了多种数据结构的实现代码,包括数组、链表、栈、队列、树、图等。...
算法与数据结构涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
数据结构学习资料分享 内容概览: 本次分享包涵了大学计算机相关专业必学的“数据结构”课程的一系列学习资料。主要包括: 算法代码:我们提供了多种数据结构的实现代码,包括数组、链表、栈、队列、树、图等。...
4.18 List高级-数据结构:Queue队列 44 4.19 List高级-数据结构:Deque栈 44 4.20 Set集合的实现类HashSet 45 4.21 Map集合的实现类HashMap 46 4.22单例模式和模版方法模式 48 Java SE核心II 49 5.1 Java异常处理...
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
算法与数据结构涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
算法与数据结构它们分别涵盖了以下主要内容: 数据结构(Data Structures): ...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
常见的数据结构有数组、链表、栈、队列、树、图等。 算法则是解决特定问题的步骤,是对数据运算和操作的详细描述。算法的设计和选择会直接影响到程序的效率,因此,在设计和选择算法时,需要考虑到时间复杂度、空间...
常见的数据结构有数组、链表、栈、队列、树、图等。 算法则是解决特定问题的步骤,是对数据运算和操作的详细描述。算法的设计和选择会直接影响到程序的效率,因此,在设计和选择算法时,需要考虑到时间复杂度、空间...
算法与数据结构它们分别涵盖了以下主要内容: 数据结构(Data Structures): ...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。