Estrutura de dados e fila circular de simulação de algoritmo_array

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.
Insira a descrição da imagem aqui
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];
		}

}
Publicado 27 artigos originais · elogiado 2 · visitas 680

Acho que você gosta

Origin blog.csdn.net/qq_44273739/article/details/104849730
Recomendado
Clasificación