数据结构与算法(二)
队列
环形队列
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t3Q4tHr7-1605322137838)(
)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tW11ehno-1605322137841)(
顺序队列的数组使用一次就不能再次使用,改成环形队列可以增加复用性
public class circleArrayQueue {
public static void main(String[] args) {
}
}
class circleArray{
private int maxSize;//表示数组的最大容量
private int front;//队列头
private int rear; //队列尾
private int[] arr;//该数据用于存放数据,模拟队列
public circleArray(int arrMaxSize){
maxSize = arrMaxSize;
arr = new int[maxSize];
}
//判断队列是否满
public boolean isFull(){
return (rear+1)%maxSize == front;
}
//判断队列是否为空
public boolean isEmpty(){
return rear == front;
}
//添加数据到队列
public void addQueue(int n){
//判断队列是否满
if (isFull()){
System.out.println("队列满,不能加入数据—");
return;
}
//直接让数据加入
arr[rear] = n;
//将rear后移,这里必须考虑取模
rear = (rear+1) %maxSize;
}
//获取数据出队列
public int getQueue(){
if (isEmpty()){
throw new RuntimeException("队列为空,不能取数据");
}
//这里需要分析出front是指向队列的第一个元素
//1.先把front对应的值保留到一个临时变量
//2.将front后移
//3.将临时保存的变量返回
int value = arr[front];
front = (front + 1)%maxSize;
return value;
}
//显示队列的所有数据
public void showQueue(){
//遍历
if (isEmpty()){
System.out.println("队列为空,没有数据");
return;
}
for (int i = front ; i < front + size(); i++){
System.out.printf("arr[%d]=%d\n",i % maxSize,arr[i % maxSize]);
}
}
//求出当前队列有效数据的个数
public int size(){
return (rear + maxSize - front) % maxSize;
}
//显示队列的头数据,注意不是取出数据
public int headQueue(){
if (isEmpty()){
throw new RuntimeException("队列是空但,没有数据");
}
return arr[front];
}
}
普通队列
public class ArrayQueue {
public static void main(String[] args) {
}
}
class ArrayQueue1{
private int maxSize;//表示数组的最大容量
private int front;//队列头
private int rear; //队列尾
private int[] arr;//该数据用于存放数据,模拟队列
//创建队列的构造器
public ArrayQueue1(int arrMaxSize){
maxSize = arrMaxSize;
arr = new int[maxSize];
front = -1;//指向队列头部,分析出front式指向队列头的前一个位置
rear = -1;//支项为列为,支项队列尾的数据(即就是队列的最后一个数据)
}
//判断队列是否满
public boolean isFull(){
return rear == maxSize - 1;
}
//判断队列是否为空
public boolean isEmpty(){
return rear == front;
}
//添加数据到队列
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 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]);
}
}
//显示队列的头数据,注意不是取出数据
public int headQueue(){
if (isEmpty()){
throw new RuntimeException("队列是空但,没有数据");
}
return arr[front + 1];
}
}
注意不是取出数据
public int headQueue(){
if (isEmpty()){
throw new RuntimeException("队列是空但,没有数据");
}
return arr[front + 1];
}
}