1. O que é uma fila circular?
Resposta: A fila circular é antes de tudo uma estrutura de dados linear, ou seja, uma lista ordenada. Segundo, segue o princípio de primeiro a entrar, primeiro a sair, ou seja, FIFO (primeiro a entrar, primeiro a sair). A fila circular é uma estrutura de dados mais eficiente, projetada para compensar o problema do estouro falso de filas comuns.
2. Como usar uma matriz para simular uma fila circular?
Resposta:
- A saída e a entrada da fila são processadas separadamente dos front-ends e back-ends. Portanto, são necessárias duas variáveis front e rear para registrar os subscritos dos front-ends e back-end da fila. Front muda com a saída de dados e rear muda com a entrada de dados.
- Definição maxSize é a capacidade máxima da fila.
- É claro como julgar quando a fila está vazia: quando traseira == na frente, essa condição de julgamento não muda se é uma fila normal ou circular.
- Como determinar quando a fila está cheia: quando (traseira + 1)% maxSize == frente cheia]
- Inicialmente, os valores iniciais de traseira e dianteira são ambos 0. (Para filas comuns, o valor inicial é -1)
- Como inserir um elemento: Primeiro, você deve julgar se a fila está vazia, depois inserir o elemento diretamente na posição em que a parte traseira está localizada e definir a parte traseira + 1, mas preste atenção ao usar% para tirar o restante da capacidade máxima.
public void addQueue(int n) {
if (isFull()) {
System.out.println("队列满,无法加入..");
return;}
arr[rear] = n;
rear = (rear + 1) % maxSize;}
- Como exibir elementos:
public int getQueue() {
if (isEmpty()) {
throw new RuntimeException("队列空~");}
int value = arr[front];
front = (front + 1) % maxSize;
return value;}
3. Pontos de conhecimento aprendidos
- Como escrever a função de inicialização da classe
def __init__(self,size=3):
#这里size如果没有写参数时,则默认初始化为3
self._size = size+1 #java代码中的maxSize
self._data = [0]*(size+1) #带self的变量都是类的属性
self._front = 0
self._rear = 0
- Quando a fila circular é inicializada para criar uma equipe vazia, deixe front = rear = 0;
quando a equipe está vazia: front = rear
Quando a equipe está cheia: front = rear também é estabelecida,
portanto, é necessário concordar quando o ponteiro da fila está na próxima posição do ponteiro da cauda. Como um sinal de status "completo".
Isto é:
Quando a equipe está cheia: (traseira + 1)% maxsize = frente
Código completo:
package com.xiaofan.Arrayqueue;
import java.util.Scanner;
public class CircleArrayQueue {
public static void main(String[] args) {
// 测试
System.out.println("测试循环数组");
ArrayQueue arr = new ArrayQueue(3);
char key = ' ';//获取用户输入
Scanner scanner = new Scanner(System.in);
boolean loop = true;
while(loop) {
System.out.println("s(show):显示队列");
System.out.println("e(exit):退出程序");
System.out.println("a(add):添加数据到队列");
System.out.println("g(get):从队列取出数据");
System.out.println("h(head):查看队列头的数据");
key = scanner.next().charAt(0);//
switch(key) {
case 's':arr.show();break;
case 'e':
scanner.close();
loop = false;
break;
case 'a':
System.out.println("输入一个数:");
int value = scanner.nextInt();
arr.addQueue(value);
break;
case 'g':
try {
//System.out.println("df");
int res = arr.getQueue();
System.out.printf("取出数据为%d",res);
}catch(Exception e) {
e.getMessage();
}
break;
case 'h':
try {
int res = arr.headQueue();
System.out.printf("队列的头数据为%d\n",res);
}catch(Exception e) {
e.getMessage();
}
break;
default:
break;
}
}
System.out.println("程序退出!");
}
}
class CirleArray{
private int maxSize;// 表示最大容量
private int front;//初始时指向0
private int rear;//初始时指向0
private int[] arr;
public CirleArray(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 + 1) % maxSize;
}
public int getQueue() {
if (isEmpty()) {
// 抛异常
System.out.println("队列为空");
throw new RuntimeException("队列为空,不能取值\n");
}
//1.先临时保存队列头部的值
//2.再将front后移,考慮取余
//3。再把临时保存的值返回
int value = arr[front];
front = (front + 1) % maxSize;
return value;
}
public void show() {
//int p = front + 1;
if (isEmpty()) {
System.out.println("队列为空,无法显示");
}
//从front开始遍历,遍历队列所有元素个数次
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];
}
}