Cola de estructura de datos (descripción del lenguaje C)

1 El concepto de conexión en cola

La cola es otra tabla especial. Esta tabla solo realiza operaciones de eliminación en la cabecera de la tabla (la cabecera de la cola) y se inserta solo al final de la tabla (el final de la cola) . Dado que la modificación de la cola se lleva a cabo de acuerdo con la regla de primero en entrar , primero en salir , la cola también se denomina tabla Primero en entrar, primero en salir (Primero en entrar, primero en salir), o tabla FIFO para abreviar.

Supongamos que la cola es a (1), a (2) ... a (n), entonces a (1) es el elemento principal del equipo y a (n) es el elemento final. Los elementos de la cola se ingresan en el orden de a (1), a (2) ... a (n), y la cola de salida solo se puede salir en este orden. En otras palabras, solo después de que un (1) abandona la cola puede un (2) salir de la cola. Solo después de que a (1), a (2) ... a (n-1) todos abandonen la cola, a (n) puede salir de la cola. La siguiente figura es un diagrama esquemático de la cola.
Inserte la descripción de la imagen aquí
Las 6 operaciones básicas que admite la cola son las siguientes.
(1) QueueEmpty (Q): prueba la cola. Si está vacío.
(2) QueueFull (Q): prueba si la cola Q está llena.
(3) QueueFirst (Q): devuelve el primer elemento de la cola.
(4) QueueLast (Q): Devuelve el último elemento de la cola Q.
(5) EnterQueue (x, Q): Inserte el elemento x al final de la cola Q.
(6) DeleteQueue (Q): Elimina y devuelve el elemento principal de la cola Q.

2 Utilice punteros para implementar colas

Se puede utilizar cualquier método de implementación de una tabla para implementar una cola. La implementación de la cola con punteros en realidad da como resultado una lista enlazada individualmente. El tipo de nodo de cola es el mismo que el del nodo de lista enlazado individualmente.

typedef struct qnode *qlink;//队列结点指针类型
typedef qnode{
    
    //队列结点
	Qitem element;//队列元素
	qlink next;//指向下一结点的指针
}Qnode;

2.1 El tipo de cola está definido por QItem

El tipo de elemento de la cola aquí se define como int.

typedef int QItem;//队列元素类型
typedef QItem *Qaddr;//队列元素指针类型
void QItemShow(QItem x)
{
    
    //输出队列元素
	printf("%d",x);
}

2.2 Función NewQNode ()

La función NewQNode () genera un nuevo nodo de cola.

qlink NewQNode()
{
    
    
	return (qlink)malloc(sizeof(Qnode));
}

2.3 Cola implementada con punteros

Se define de la siguiente manera:

typedef struct lque *Queue;//队列指针类型
typedef struct lque{
    
    //队列结构
	qlink front;//队首指针
	qlink rear;//对尾指针
}Lqueue;

Dado que los nuevos elementos de la cola se insertan al final de la cola, se usa un puntero posterior para indicar el final de la cola, de modo que la operación de la cola no tiene que verificar toda la tabla de principio a fin, mejorando así la eficiencia de la operación.
Inserte la descripción de la imagen aquí

2.4 Función QueueInit ()

La función QueueInit () establece el puntero de cabeza al frente y el puntero de cola en punteros nulos para crear una cola vacía.

Queue QueueInit()
{
    
    
	Queue Q=(Queue)malloc(sizeof *Q);
	Q->front=Q->rear=0;
	return Q;
}

2.5 Función QueueEmpty ()

Insista en si front es un puntero nulo.

int QueueEmpty(Queue Q)
{
    
    
	return Q->front==0;
}

2.6 Función QueueFirst ()

Devuelve el elemento del primer nodo de la cola Q.

QItem QueueFirst(Queue Q)
{
    
    //前提队列非空
	if(QueuEmpty(Q)) exit(1);
	return Q->queue[(Q->front+1)%Q-?maxsize];
}

2.7 Función QueueLast ()

Devuelve el elemento del nodo final de la cola Q.

QItem QueueLast(Queue Q)
{
    
    //前提队列非空
	if(QueuEmpty(Q)) exit(1);
	return Q->queue[Q->rear];
}

2.8 Función EnterQueue (Q)

Primero cree un nuevo nodo para el elemento x, luego modifique el puntero del nodo de fin de línea de la cola Q, inserte un nuevo nodo al final de la línea y haga que el nuevo nodo se convierta en el nuevo nodo de fin de línea.

void EnterQueue(QItem x,Queue Q)
{
    
    
	qlink p=NewQNode();//创建一个新结点
	p->element=x;
	p->next=0;
	//队尾插入新结点
	if(Q->front) Q->rear->next=p;//队列非空
	else 	Q->front=p;//空队列
	Q->rear=p;
}

2.8 Función DeleteQueue (Q)

Primero almacena el primer elemento del equipo en x, luego modifica el puntero del primer nodo de la cola Q para que apunte al siguiente nodo del primer nodo del equipo, así borra el primer nodo del equipo, y finalmente regresa ax .

QItem DeleteQueue(Q)
{
    
    //前提队列非空
	if(QueuEmpty(Q)) exit(1);
	QItem x=Q->front_>element;//将队首元素存于x中
	//删除队首结点
	qlink p=Q->front;
	Q->front =Q->front->next;
	free(p);
	return x;
}

El uso de punteros para implementar operaciones básicas en colas requiere solo O (1) tiempo de cálculo.

3 Implementar una cola con una matriz circular

3.1 ¿Qué es una matriz circular?

Las unidades en la cola [0: maxsize-1] no están dispuestas en una fila, sino rodeadas por un círculo, es decir, la cola [0] está conectada al final de la cola [maxsize-1], que es una matriz circular.

3.2 Tres formas de indicar los elementos de cabeza y cola del equipo

Cuando se utiliza una matriz circular para implementar una cola, los elementos de la cola desde el principio hasta el final de la cola se almacenan en una unidad continua de la matriz circular en el sentido de las agujas del reloj . Cuando un nuevo elemento ingresa a la cola, el cursor trasero se puede mover en el sentido de las agujas del reloj una posición y el nuevo elemento se almacena en esta unidad. Para dejar el equipo, simplemente mueva el cursor frontal de la cabeza del equipo un lugar en el sentido de las agujas del reloj.
Indique los elementos de la cabeza y la cola de
una manera abstracta . 1. Utilice directamente el cursor de la cabeza al frente para señalar la unidad donde se encuentra el elemento de la cabeza, y use el cursor de la cola hacia atrás para señalar la unidad donde se encuentra el elemento de la cola, como como se muestra en la figura siguiente.
Inserte la descripción de la imagen aquí

En segundo lugar, use el cursor de la cabeza al frente para señalar la unidad antes del elemento donde se encuentra el jefe del equipo, y use el cursor de la cola hacia atrás para señalar la celda donde se encuentra el elemento de la cola, como se muestra en la figura siguiente.
Inserte la descripción de la imagen aquí

En tercer lugar, use el cursor de la cabeza al frente para señalar la unidad donde se encuentra el elemento de la cabeza, y use el cursor de la cola hacia atrás para apuntar a la siguiente unidad de la unidad donde se encuentra el elemento de la cola, como se muestra en la figura siguiente.
Inserte la descripción de la imagen aquí

El método específico indica los elementos de cabeza y cola del
equipo 1. Utilice directamente el cursor de cabeza al frente para señalar la unidad donde se encuentra el elemento de cabeza, y use el cursor de cola hacia atrás para señalar la unidad donde se encuentra el elemento de cola. como se muestra en la figura siguiente.
Inserte la descripción de la imagen aquí
En segundo lugar, use el cursor de la cabeza al frente para señalar la unidad antes del elemento donde se encuentra el jefe del equipo, y use el cursor de la cola hacia atrás para señalar la celda donde se encuentra el elemento de la cola, como se muestra en la figura siguiente.
Inserte la descripción de la imagen aquí

En tercer lugar, use el cursor de la cabeza al frente para señalar la unidad donde se encuentra el elemento de la cabeza, y use el cursor de la cola hacia atrás para apuntar a la siguiente unidad de la unidad donde se encuentra el elemento de la cola, como se muestra en la figura siguiente.
Inserte la descripción de la imagen aquí

3.3 Cola llena

1. Utilice directamente el cursor frontal para señalar la unidad donde se encuentra el elemento principal, y use el cursor trasero para señalar la unidad donde se encuentra el elemento de cola, como se muestra en la figura siguiente.
Inserte la descripción de la imagen aquí

En segundo lugar, use el cursor de la cabeza al frente para señalar la unidad antes del elemento donde se encuentra el jefe del equipo, y use el cursor de la cola hacia atrás para señalar la celda donde se encuentra el elemento de la cola, como se muestra en la figura siguiente.
Inserte la descripción de la imagen aquí

En tercer lugar, use el cursor de la cabeza al frente para señalar la unidad donde se encuentra el elemento de la cabeza, y use el cursor de la cola hacia atrás para apuntar a la siguiente unidad de la unidad donde se encuentra el elemento de la cola, como se muestra en la figura siguiente.
Inserte la descripción de la imagen aquí

3.4 Cola vacía

1. Utilice directamente el cursor frontal para señalar la unidad donde se encuentra el elemento principal, y use el cursor trasero para señalar la unidad donde se encuentra el elemento de cola, como se muestra en la figura siguiente.
Inserte la descripción de la imagen aquí

En segundo lugar, use el cursor de la cabeza al frente para señalar la unidad antes del elemento donde se encuentra el jefe del equipo, y use el cursor de la cola hacia atrás para señalar la celda donde se encuentra el elemento de la cola, como se muestra en la figura siguiente.
Inserte la descripción de la imagen aquí

En tercer lugar, use el cursor de la cabeza al frente para señalar la unidad donde se encuentra el elemento de la cabeza, y use el cursor de la cola hacia atrás para apuntar a la siguiente unidad de la unidad donde se encuentra el elemento de la cola, como se muestra en la figura siguiente.
Inserte la descripción de la imagen aquí
Hay dos enfoques para resolver cualquier problema que represente una cola llena y una cola vacía. Uno es establecer otro booleano para indicar si la cola está vacía o llena. En segundo lugar, se acuerda que la cola está llena cuando el número de elementos en la matriz circular alcanza maxsize-1.

Utilice el cursor frontal para apuntar directamente a la unidad donde se encuentra el elemento principal, y el cursor trasero hacia atrás para apuntar a la unidad donde se encuentra el elemento final, y use el método de que la cola está llena cuando el número de elementos en el La matriz de bucle alcanza el tamaño máximo 1. Cola llena y cola vacía.

3.5 Cola implementada con matriz circular

Idea: Defina el tipo de puntero de cola, estructura de cola, cursor al principio de la cola, cursor al final de la cola y matriz circular.

typedef srtuct aque *Queue;//队列指针类型
typedef struct aque{
    
    //队列结构
	int maxsize;//循环数组大小
	int front;//队首游标
	int rear;//对尾游标
	QItem *queue;//循环数组
}Aqueue;

La cola de matriz circular se utiliza para almacenar los elementos en la cola.

3.6 Función QueueInit (tamaño)

La función QueueInit (tamaño) asigna una cola de matriz circular con una capacidad de tamaño a la cola, y establece el cursor frontal y el cursor posterior en la cabecera de la cola en 0 para crear una cola vacía.

Queue QueueInit(int size)
{
    
    
	Queue Q=(Queue)malloc(sizeof *Q);
	Q->queue=(QItem *)malloc(size*sizeof(QItem));
	Q->maxsize=size;
	Q->front=Q->rear=0;
	return 0;
}

3.7 Función QueueEmpty (Q)

Compruebe si el cursor delantero y el cursor trasero se superponen para determinar si la cola Q está vacía.

int QueueEmpty(Queue Q)
{
    
    
	return Q->front=Q->rear;
}

3.8 Función QueueFull (Q)

La función QueueFull (Q) detecta si la parte delantera del cursor de la cola y la parte posterior del cursor de la cola se superponen después de insertar un elemento al final de la cola Q para determinar si la cola Q está llena.

int QueueFull(Queue Q)
{
    
    
	return(((Q->rear+1)%Q->maxsize==Q->front)?1:0);
}

3.9 Función QueueFirst (Q)

La función QueueFirst (Q) devuelve el primer elemento de la cola Q. Dado que el frente del equipo apunta a la posición anterior del primer elemento del equipo, el subíndice del primer elemento del equipo en la cola de matriz de bucle es (front + 1)% maxsize.


QItem QueueFirst(Queue Q)
{
    
    //前提:队列非空
	if(QueueEmpty(Q)) exit(1);
	return Q->queue[(Q->front+1)%Q->maxsize];
}

3.10 Función QueueLast (Q)

Devuelve el elemento de cola del escuadrón de cola [posterior] de la cola de almacenamiento Q.

QItem QueueLast(Queue Q)
{
    
    //前提:队列非空
	if(QueueEmpty(Q)) exit(1);
	return Q->queue[Q->rear];
}

3.11 Función EnterQueue (x, Q)

Primero calcule la siguiente posición (posterior + 1)% de tamaño máximo del elemento de cola de la cola, y luego inserte un nuevo elemento x en esta posición.

void EnterQueue(QItem x,Queue Q)
{
    
    
	if(QueueFull(Q)) exit(1);
	Q->rear=(Q->rear+1)%Q->maxsize;
	Q->queue[Q->rear]=x;
}

3.12 Función DeleteQueue (Q)

Idea: Primero busque el elemento a la cabeza del equipo y luego elimínelo.
Primero modifique el cursor al frente a la siguiente posición (frente + 1)% maxsize, y luego regrese el elemento en esa posición, es decir, el elemento a la cabeza del equipo.

QItem DeleteQueue(Queue Q)
{
    
    //前提:队列非空
	if(QueueEmpty(Q)) exit(1);
	Q->front=(Q->front+1)%Q->maxsize;
	return Q->queue[Q->front];
}

Las operaciones básicas anteriores de la cola implementadas con una matriz circular solo requieren O (1) tiempo de cálculo.

Supongo que te gusta

Origin blog.csdn.net/qq_45059457/article/details/114869484
Recomendado
Clasificación