前言
本文将用java语言实现常用数据结构之一: 队列
一、队列是什么?
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。 队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。
https://baike.baidu.com/item/%E9%98%9F%E5%88%97/14580481?fr=aladdin
二、具体实现
1.思路分析
队列中需要
private int front;//队列头
private int rear; //队列尾
为了规定初始容量 我们可以规定 private int maxSize;最大数量
用数组实现队列,则队列就是由数组组成的
private int[] arr;//存放数据 ,模拟队列
private int maxSize;
private int front;//队列头
private int rear; //队列尾
/**
* 存放数据 ,模拟队列
*/
private int[] arr;//存放数据 ,模拟队列
构造方法 确定初始值
front=-1;//指向队列的头部前一个位置
rear=-1;//指向队列尾部的具体位置,就是队列最后一个数据的位置
这两个初始值关系到怎么确定当前数据的位置,要注意
public arrQueue(int arrMaxSize){
maxSize=arrMaxSize;
arr=new int[maxSize];
front=-1;//指向队列的头部前一个位置
rear=-1;//指向队列尾部的具体位置,就是队列最后一个数据的位置
}
2.获取、添加、删除、遍历队列方法的实现
辅助方法
//判断队列是否满
public boolean isFull(){
return rear==maxSize -1;
}
public boolean isEmpty(){
return rear==front;
}
添加:首先判断是否满了 如果是 则直接返回
如果还没满 让头(rear)后移(++) 并赋值将数据插入至队列的尾部;
public void addQueue(int n){
if (isFull()){
System.out.println("已经满了");
return;
}
//rear后移 因为先进先出 头部分先被取到 添加从尾部开始添加
rear++;
arr[rear]=n;
}
出列
//获取队列
public int getQueue(){
if (isEmpty()){
throw new RuntimeException("队列空,不能获取数据");
}
//front前移 因为先进先出 头部分先被取到
front++;
return arr[front];
}
显示队列头部,不是出列 不删除数据
/**
* 显示队列的头部 不是取数据
*/
public int headQueue(){
if (isEmpty()){
throw new RuntimeException("队列空,不能获取数据");
}
return arr[front+1];
}
遍历队列 使用fo循环
public void showQueue(){
if (isEmpty()){
System.out.println("没有数据");
return;
}
for (int i=0;i<arr.length;i++){
System.out.printf("arr[%d]=%d\n",i,arr[i]);
}
}
总结+技巧+语法
要想在后台输出占位符 不能直接在Ideal sout 要格式化输出 printf 而不是println
在增删改查 时首先要判断是否为空isEmpty或者是否为满isFull,而后再进行具体操作(如将rear++)
有具体返回类型的方法发现错误时候就不能直接return 而是要throw RuntimeException