Implementación de la cola de la estructura de datos (desafío de programación 2)

Implementación de la cola de la estructura de datos.

La idea de una cola es la más común cuando la CPU maneja multitarea.Veamos primero un ejemplo.

tema

Las n tareas existentes denominadas namei y el tiempo de procesamiento timei se organizan en una fila, y la CPU procesa estas tareas una por una a través del método de programación por turnos, y cada tarea procesa como máximo q ms (esta vez se convierte en un intervalo de tiempo). Si la tarea no se ha procesado después de q ms, la tarea se moverá al final de la cola y la CPU comenzará a procesar inmediatamente la siguiente tarea.
Ejemplo: suponiendo que q es 100, existe la siguiente cola de tareas
A(150)—B(80)—C(200)—D(200).
Primero, A se procesa durante 100 ms y luego se mueve al final de la cola con los 50 ms restantes.
B(80)—C(200)—D(200)—A(50)
A continuación, B se procesa durante 80 ms, y el procesamiento se completa y desaparece de la cola a los 180 ms.
C(200)—D(200)—A(50)
y así sucesivamente
—————————————————————————————————— ——— —

ingresar

nq
nombre1 tiempo1
nombre2 tiempo2
... ...
En la primera línea, ingrese el número entero n que representa el número de tareas y el número q que representa el intervalo de tiempo, separados por un espacio.
Las siguientes n líneas ingresan la información para cada tarea. El nombre de la cadena y el tiempoi están separados por un espacio.

producción

Muestra el nombre de cada tarea y la hora de finalización de acuerdo con el orden en que se completan las tareas. El nombre de la tarea y la hora de finalización correspondiente están separados por un espacio. Cada par de nombre de tarea y hora de finalización ocupa 1 línea.

límite

1 ≤ n ≤ 100 000
1 ≤ q ≤ 1000
1 ≤ tiempoi ≤ 50 000
1 ≤ longitud de cadena nombrei ≤ 10
1 ≤ suma de tiempoi ≤ 1 000 000

ejemplo de entrada

5 100
p1 150
p2 80
p3 200
p4 350
p5 20

ejemplo de salida

p2 180
p5 400
p1 450
p3 550
p4 800

primero mira el codigo

#include<stdio.h>
#include<string.h>
#define LEN 10005

typedef struct PP {
    
    
	char name[100];
	int t;
} P;

P Q[LEN];

int head, tail, n;          //n代表总任务数

bool isEmpty() {
    
    
	return head == tail;
}

void enqueue(P x) {
    
              //该函数用来向队列尾添加元素
	Q[tail] = x;
	tail = (tail + 1) % LEN;
}

P dequeue() {
    
                   //该函数用来从队列前取出元素
	P x = Q[head];
	head = (head + 1) % LEN;
	return x;
}

int min(int a, int b) {
    
     return a < b ? a : b; }

int main()
{
    
    
	int elaps = 0, c;
	int i, q;                    //q代表的是时间片
	P u;
	scanf("%d %d", &n, &q);
	//按顺序添加任务到队列
	for (i = 1; i <= n ; i++)
	{
    
    
		scanf("%s", Q[i].name);
		scanf("%d", &Q[i].t);
	}
	head = 1; tail = n + 1;

	while (tail != head)
	{
    
    
		u = dequeue();
		c = min(q, u.t);
		u.t -= c;
		elaps += c;
		if (u.t > 0)
		{
    
    
			enqueue(u);
		}
		else
		{
    
    
			printf("%s %d\n", u.name, elaps);
		}
	}
	return 0;
}

La cola se puede simular mediante el uso de una matriz, que requiere principalmente las siguientes variables y funciones
1. Una matriz para almacenar datos: Q
2. El encabezado se usa como puntero del encabezado, la eliminación de la cola eliminará el elemento señalado por el encabezado cada vez .
3. La cola apunta al final de la cola, su valor es n+1, cada cola almacenará los datos procesados ​​detrás del final de los datos.
4. función enqueue (x), agrega elementos a la cola, tenga en cuenta que es un parámetro
5. función dequeue (), una función utilizada para sacar elementos.
Cuando el programa se está ejecutando, el elemento se eliminará desde el comienzo de Q y se agregará a la posición indicada por la cola con puesta en cola después del procesamiento. Este proceso continúa hasta que la cabeza y la cola son iguales y el proceso se completa.

Sin embargo, para hacer esto, primero debe asegurarse de que la longitud de la matriz sea suficiente, de lo contrario, cuando tail+1 es fácil que el subíndice de la matriz se salga de los límites. Cuando se trata de datos grandes, la longitud de la matriz puede ser aterradora.
Si desea evitar esta situación, debe mantener el puntero principal en 0 y mover todos los datos al comienzo de la matriz después de cada ejecución de dequeue( ). La desventaja es que cada movimiento agrega complejidad O(n).
La solución en el libro es usar un búfer circular para administrar los datos.
alternativa
Puede entenderse como una manecilla de segundos. Cuando tail+1=12 excede el rango de la matriz, se establece en 0. Ha pasado similar a 1 minuto, y el cálculo comienza desde 1 segundo.

//对head和tail的操作
head = (head + 1) % MAX      //MAX表示数组元素个数
tail = (tail + 1) % MAX      

Estas dos expresiones establecerán cabeza y cola en 0 cuando excedan el número de datos de matriz.

El búfer de anillo puede implementar operaciones de poner y quitar cola al mismo tiempo con una complejidad de O(1).

La cola y la pila son dos estructuras de datos simples que vale la pena estudiar cuidadosamente.

Supongo que te gusta

Origin blog.csdn.net/qq_32577169/article/details/94970351
Recomendado
Clasificación