数据结构-队列(四)
一、队列的定义
- 队列(queue)是一种只能在不同端进行插入或删除操作的线性表。
- 进行插入的一端称做队尾(rear),进行删除的一端称做队头或队首(front)。
- 队列的插入操作通常称为进队或入队(push),队列的删除操作通常称为出队或离队(pop)。
队列主要特点:
- 先进先出,即先进队的元素先出队。
- 每次进队的元素作为新队尾元素,每次出队的元素只能是队头的元素。
- 队列也称为先进先出表。
二、队列顺序存储结构
基本算法实现,front队头指针指向队头元素前一个位置,rear指向队尾元素
public class MyQuequ_arr<E>{
private int initcapacity = 100;
private E[] data;
private int front;
private int rear;
public MyQuequ_arr() {
data = (E[]) new Object[initcapacity];
front = rear = -1;
}
//队列基本运算
/**
* 进队
* @param e
*/
public void push(E e) {
rear++;
this.data[rear] = e;
}
/**
* 出队,返回队头元素
*/
public E pop() {
if (front == rear) {
return null;
} else {
front++;
E e = this.data[front];
return e;
}
}
/**
* 取队头元素
*/
public E peek() {
if ( front == rear) {
return null;
} else {
return this.data[front+1];
}
}
/**
* 判断对列是否为空,若空返回真;否则返回假
*/
public boolean empty() {
return front==rear;
}
}
循环队列
- 队列满条件的判断
- 标志位
- 牺牲一个空间
public class MyQuequ_arr1<E>{
private int initcapacity = 8;
private E[] data;
private int front;
private int rear;
public MyQuequ_arr1() {
data = (E[]) new Object[initcapacity];
front = rear = 0;
}
//队列基本运算
/**
* 进队
* @param e
*/
public void push(E e) {
if( (rear + 1) % initcapacity == front) {
throw new IndexOutOfBoundsException();
}
rear = (rear + 1) % initcapacity;
data[rear] = e;
}
/**
* 出队,返回队头元素
*/
public E pop() {
if(front == rear) {
return null;
}
front = (front + 1) % initcapacity;
return (E) data[front];
}
/**
* 取队头元素
*/
public E peek() {
if(front == rear) {
return null;
}
return (E) data[(front + 1) % initcapacity];
}
/**
* 判断对列是否为空,若空返回真;否则返回假
*/
public boolean empty() {
return front==rear;
}
}
三、队列链式存储结构
基本算法实现
public class MyQueue_link<E>{
private Node<E> front; //队头
private Node<E> rear; //队尾
public static class Node<E>{
E item;
Node<E> next;
public Node(E item, Node<E> next) {
this.item = item;
this.next = next;
}
}
public MyQueue_link() {
front = rear = null;
}
/**
* 判断是否为空
* @return
*/
public boolean empty(){
return front == null;
}
/**
* 入队
*/
public void push(E e){
if(rear==null){
front = rear = new Node<>(e,null);
}else{
Node<E> tNode = new Node<>(e,null);
rear.next = tNode;
rear = tNode;
}
}
/**
* 出队
* @return
*/
public E pop(){
if(front==null){
return null;
}
E e = front.item;
front = front.next;
return e;
}
public E peek(){
if(front == null){
return null;
}
return front.item;
}
}
四、双端队列
deque (double-ended queue,双端队列)是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。
双端队列是限定插入和删除操作在表的两端进行的线性表。这两端分别称做端点1和端点2。也可像栈一样,可以用一个铁道转轨网络来比喻双端队列。在实际使用中,还可以有输出受限的双端队列(即一个端点允许插入和删除,另一个端点只允许插入的双端队列)和输入受限的双端队列(即一个端点允许插入和删除,另一个端点只允许删除的双端队列)。而如果限定双端队列从某个端点插入的元素只能从该端点删除,则该双端队列就蜕变为两个栈底相邻的栈了。
五、优先队列
优先队列就是指定队列中元素的优先级,按优先级越大越优先出队,而普通队列中按进队的先后顺序出队,可以看成进队越早越优先。
Java中提供了优先队列类PriorityQueue
,已实现的接口有Queue 。