Estructura de datos y algoritmo_array simulación cola circular

1. ¿Qué es una cola circular?
Respuesta: La cola circular es ante todo una estructura de datos lineal, es decir, una lista ordenada. En segundo lugar, sigue el principio de primero en entrar, primero en salir, a saber, FIFO (primero en entrar, primero en salir). La cola circular es una estructura de datos más eficiente diseñada para compensar el problema del falso desbordamiento de las colas ordinarias.
Inserte la descripción de la imagen aquí
2. ¿Cómo usar una matriz para simular una cola circular?
Respuesta:

  • La salida y la entrada de la cola se procesan por separado de los extremos frontal y posterior. Por lo tanto, se requieren dos variables frontal y posterior para registrar los subíndices de los extremos frontal y posterior de la cola. El frente cambiará con la salida de datos y la parte posterior cambiará con la entrada de datos.
  • Definición maxSize es la capacidad máxima de la cola.
  • Está claro cómo juzgar cuando la cola está vacía: cuando rear == front, esta condición de juicio no cambia si se trata de una cola normal o circular.
  • Cómo determinar cuándo la cola está llena: cuándo (trasero + 1)% maxSize == frente lleno]
  • Inicialmente, los valores iniciales de trasero y delantero son ambos 0. (Para colas ordinarias, el valor inicial es -1)
  • Cómo insertar un elemento: en primer lugar, debe juzgar si la cola está vacía, luego insertar el elemento directamente en la posición donde se encuentra la parte posterior y establecer la parte posterior + 1, pero preste atención al uso de% para aprovechar el resto de la capacidad máxima.
 public void addQueue(int n) {
   if (isFull()) {
	System.out.println("队列满,无法加入..");
	return;}
	arr[rear] = n;
	rear = (rear + 1) % maxSize;}  
  • Cómo desplegar elementos:
public int getQueue() {
  	if (isEmpty()) {
		throw new RuntimeException("队列空~");}
		int value = arr[front];
		front = (front + 1) % maxSize;
		return value;}

3. Puntos de conocimiento aprendidos

  • Cómo escribir la función de inicialización de la clase
 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
  • Cuando la cola circular se inicializa para crear un equipo vacío, deje que front = rear = 0;
    cuando el equipo esté vacío: front = rear
    Cuando el equipo esté lleno: front = rear también se establece,
    por lo que es necesario acordar cuándo el puntero de la cola de la cola está en la siguiente posición del puntero de cola de cola. Como una señal de estado "completo".
    Eso es:

Cuando el equipo está lleno: (trasero + 1)% maxsize = delantero

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];
		}

}
27 artículos originales publicados · elogiados 2 · visitas 680

Supongo que te gusta

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