队列与环形队列
有一种数据结构叫队列,它的特性是先进先出(FIFO),我们来简单实现一下队列。
1.普通队列
(1)如上图表示,我们用数组来模拟队列,Maxsize表示队列的最大容量。
(2)我们定义两个指针来表示,头指针为front,尾指针为rear,初始他们都指向-1。
(3)当队列添加元素进来时,rear往后移动
(4)当队列元素出去时,front往后移动
(5)当rear=front时队列为空
(6)当rear=Maxsize-1时,表示rear已经指向了队列的末尾,表示队列已经满。
public class Queue {
private int maxsize;
private int front;
private int rear;
private int [] arr;
public Queue(int size)
{
maxsize=size;
front=-1;
rear=-1;
arr=new int [maxsize];
}
//判断队列是否满
public boolean isfull()
{
return rear==maxsize-1;
}
//判断队列是否为空
public boolean isempty()
{
return rear==front;
}
//添加数进入队列
public void addqueque(int a)
{
if (isfull())
{
throw new RuntimeException("队列已经满了,无法插入");
}
rear++;
arr[rear]=a;
}
//取出队列的数据
public int putqueue()
{
if (isempty())
{
throw new RuntimeException("队列为空");
}
front++;
return arr[front];
}
//显示所有的数据
public void showqueque()
{
if (isempty())
{
throw new RuntimeException("队列为空");
}
for (int i = 0; i <arr.length ; i++) {
System.out.println(arr[i]);
}
}
//返回头的数据
public int head()
{
if (isempty())
{
throw new RuntimeException("队列为空");
}
return arr[front+1];
}
}
2.环形队列
在上面的基础上我们发现了 一个问题,就是取出元素后,无法再添加进去元素,造成了空间的浪费,因此我们将上面的队列进行改进。
(1)如上图表示,我们用数组来模拟队列,Maxsize表示队列的最大容量。
(2)我们定义两个指针来表示,头指针为front指向第一个元素0的位置,尾指针为rear指向最后一个元素的下一个,因为留出一个位置计算。
(3)rear=front队列为空
(4)(rear+1)%Maxsize= =front 队列满。
(5)队列元素的有效个数为(rear+Maxsize-front)%Maxsize==front
(6)由此得到一个环形队列
public class cireQueue {
private int maxsize;
private int rear;
private int front;
private int []arr;
public cireQueue(int size)
{
maxsize=size;
arr=new int[maxsize-1];
}
//判断是否为空
public boolean isempty()
{
return rear==front;
}
//判断是否满了
public boolean isfull()
{
return (rear+1)%maxsize==front;
}
//添加元素进入队列
public void addqueque(int a)
{
if (isfull())
{
throw new RuntimeException("队列已经满");
}
arr[rear]=a;
rear=(rear+1)%maxsize;
}
//取出队列的元素
public int putqueque()
{
if (isempty())
{
throw new RuntimeException("队列为空");
}
int value=arr[front];
front=(front+1)%maxsize;
return value;
}
//个数
public int size()
{
return (rear+maxsize-front)%maxsize;
}
//显示全部元素
public void showqueue()
{
if (isempty())
{
throw new RuntimeException("队列为空");
}
for (int i = front; i <front+size(); i++) {
System.out.printf("arr[%d]=%d\n",i%maxsize,arr[i%maxsize]);
}
}
//显示头元素
public int head()
{
if (isempty())
{
throw new RuntimeException("队列为空");
}
return arr[front];
}
}