版权声明:转载请注明原文地址。 https://blog.csdn.net/qq_39240270/article/details/86766529
队列的简单介绍:
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。
数据结构中的队列长这个样:
- 例如窗口排队时,先到的人先买票。
队列的数组实现(静态队列)
往往实现静态队列,我们都是做成循环队列,这样的好处不浪费内存资源!。
在设计尾指针rear的时候,并不指向最后一个有效的元素,在循环队列中这样设计是很方便的!因为这样设计可以让我们分得清队头和队尾。
为了防止假溢出,使用front=front%size
和rear=(rear+1)%size
算法。
public class ArrayQueue {
private int a[];
private int size;//队列的最大容量
private int nItems;//队列中实际数据的数量
private int front;//头指针
private int rear;//尾指针
public ArrayQueue() {
this(10);//未设定最大容量时,默认最大容量是10
}
//初始化
public ArrayQueue(int maxSize) {
this.a = new int[maxSize];
this.size = maxSize;
this.nItems = 0;
this.front = 0;
this.rear = 0;
}
//入队
public boolean push(int data) {
//判断队列是否已满
if(isFull()) {
System.out.println("队列已满!");
return false;
}
a[rear % size] = data;
rear = (rear + 1) % size;
nItems ++;
return true;
}
//出队
public int pop() {
//判断队列是否为空
if(isEmpty()) {
System.out.println("队列为空!");
return -1;
}
front = front % size;
nItems --;
return a[front--];
}
//遍历队列
public void traverseQueue() {
for(int i = 0;i < nItems;i++ ) {
System.out.println(a[i]);
}
}
//得到队列的数据的个数
public int size() {
return nItems;
}
//判断队列是否为空
public boolean isEmpty() {
return nItems == 0;
}
//判断队列是否已满
public boolean isFull() {
return nItems == size;
}
}
队列的链表实现
public class LinkedQueue {
private Node front;//定义头结点
private Node rear;//定义尾节点
private int size;//队列中数据的数目
//初始化
public LinkedQueue() {
this.front = null;
this.rear = null;
this.size = 0;
}
//入队
public void add(int data) {
Node node= new Node(data);
if(front == null) {
front = rear = node;
}
//插入尾巴
rear.next = node;
//将尾指针指向新的节点
rear = node;
size ++;
}
//出队
public int out() {
//判断队列是否为空
if(size == 0) {
System.out.println("队列为空!");
return -1;
}
int i = front.data;
front = front.next;
size --;
return i;
}
//遍历队列
public void traverseQueue() {
//定义一个新节点用于遍历
Node currentNode = front;
while(currentNode != null) {
System.out.println(currentNode.data);
currentNode = currentNode.next;
}
}
//得到队列的长度
public int size() {
return size;
}
}
//定义节点
class Node {
//用public声明方便存取
//数据域
public int data;
//指向下一个节点
public Node next;
public Node(int data) {
this.data = data;
}
}