Definición de la cola del lenguaje C: cola secuencial, cola circular, estructura de cola de cadena (detallada)

1. Operaciones básicas comunes y juicio de condición de colas secuenciales

队空:    Q.front=Q.rear
 队满:    Q.rear=Maxlen
 求队长:  Q.rear-Q.front

Poner en cola : 1) El nuevo elemento se agrega en la posición indicada por la parte trasera
2) parte trasera = parte trasera + 1 el puntero de cola del
equipo más uno fuera del equipo : 1) se saca el elemento indicado por la parte delantera.
2) frente = frente + 1 puntero de cabeza de equipo más uno
2. Definición de tipo de cola secuencial

#define MAXLEN 100
   typedef struct
    	{datatype  Q[MAXLEN];
    	  int front=0;
    	  int rear=0;
        } SeqQueue,*P;

P: ¿Qué es el "desbordamiento falso"? ¿Cómo solucionarlo?
Respuesta: En el equipo secuencial, cuando el puntero de cola ha alcanzado el límite superior de la matriz, no puede haber más operaciones en cola, pero en realidad hay posiciones vacías en la matriz, lo que se denomina "falso desbordamiento".
Formas de resolver el desbordamiento falso —— Adoptar la cola de ciclismo

Cola circular

Piense en ello como un anillo conectado de extremo a extremo, y llame a este vector un vector circular, y la cola almacenada en él se llama cola circular.Inserte la descripción de la imagen aquí

Nuevo problema: en la cola circular, el equipo vacío se caracteriza por Q.front = Q.rear; cuando el equipo está lleno, también habrá Q.front = Q.rear; ¡las condiciones de juicio parecerán ambiguas!
Hay tres soluciones:
① usar un contador Registre el número de elementos en la cola (es decir, la longitud de la cola);
②Agregue un bit de bandera, establezca 1 al eliminar y establezca 0 al insertar, luego puede identificar qué tipo de situación Q.front = Q.rear pertenece a
③ artificialmente desperdiciando una unidad, luego La función completa del equipo se puede cambiar a Q.front = (Q.rear + 1)% MAXLEN;

El esquema 3 se usa a menudo en la práctica (una unidad se desperdicia artificialmente):
uno de los puntos frontal y posterior al elemento real, y los otros puntos al elemento inactivo.

队空条件 :  Q.front =Q. rear       (初始化时:Q.front = Q.rear )
队满条件: Q.front = (Q.rear+1) % N         (N=maxsize)
队列长度(即数据元素个数):L=(N+Q.rear-Q.front)% N
 

Inserte la descripción de la imagen aquí
Ejemplo 1: la matriz Q [n] se utiliza para representar una cola circular, f es la posición anterior del elemento principal de la cola actual y r es la posición del elemento de cola. Supone que el número de cola de elementos menor que n, calculado como el elemento de la cola
es: A) R ^-F (B) (n- + F-R & lt)% n-
(C) n- + R ^-F (D) (n- + R ^-F)% n-
Para ¿Cuál de las cuatro fórmulas es la más razonable?
Cuando r ≥ f, (A) es razonable;
cuando r <f, (C) es razonable; combinando dos situaciones, la expresión (D) es la más razonable
. La posición anterior del elemento. Entonces la eliminación de un elemento de la cola circular, la operación es a mover el cabezal de puntero de la cola , el elemento eliminado .
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

¿Cómo formar una cola circular?
Al realizar operaciones de cola y cola en la cola circular, los punteros de cabeza y cola aún deben aumentar en 1 y avanzar.
Es solo que cuando el puntero de la cabeza a la cola apunta al límite superior del vector (MAXLEN-1), el resultado de sumar 1 es apuntar al límite inferior del vector, 0.
El resultado de sumar 1 es la forma de señalar el límite inferior del vector, 0

*(front+1)%M       (rear+1)%M*

Inserte la descripción de la imagen aquí

Equipo vacío: Q.front = Q. trasero
Equipo lleno: Q.front = (Q.rear + 1)% MAXLEN Enqueue
: Q.rear = (Q.rear + 1)% MAXLEN Dequeue
: Q.front = ( frente + 1)% MAXLEN;
buscando al capitán: (Q.rear-Q.front + MAXLEN)% MAXLEN

-3) Definición de tipo de cola circular

#define MAXLEN 100
typedef struct
	{datatype *data[MAXLEN];
	  int front;
	  int rear;
     int n;/*判队空,队满的另一方法*/
   } CseqQueue

-4) Implementación de operación de cola circular

① Inicializar la cola

CseqQueue * IniQueue (CseqQueue *Q) 
{                                                    //构造空队列
  Q= (CseqQueue *) malloc(sizeof(CseqQueue ));
  Q->rear = Q->front = 0;
  return Q;
}

Inserte la descripción de la imagen aquí
②El equipo está vacío

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

③El equipo está lleno

int QueueFull (CseqQueue *Q ) 
{
    return((Q->rear+1) % MAXLEN == Q->front);
}

④El equipo está lleno

int QueueFull (CseqQueue *Q ) 
{
    return( (Q->n) == MAXLEN);
}

⑤Entrada

int InQueue (CseqQueue *Q, datatype x ) 
{
    if (QueueFull (Q) ) 
          return 0;
   else 
      {Q->data[Q->rear] = x; 
        Q->rear = ( Q->rear+1) % MAXLEN; 
        Q->n++;
        return 1;
      }
 }

⑥Dejando el equipo

int DeQueue (CseqQueue *Q, datatype *x ) 
{
    if ( QueueEmpty (Q) ) 
        return 0;
   else
       {*x = Q->data[Q->front]; 
         Q->front = ( Q->front+1) % MAXLEN; 
         Q->n--;
         return 1;
      }
}

⑦ Toma la cabeza del equipo

int GetFront (CseqQueue *Q, datatype *x ) 
{
     if ( QueueEmpty (Q) )
          return 0;
     *x = Q->data[Q->front];
     return 1;
}

⑧ Encuentra la longitud de la cola

int QueueLength (CseqQueue  *Q)
{
  return( (Q->rear – Q->front + MAXSIZE) % MAXSIZE);
}

Estructura de la cola de la cadena

(1) estructura de la cola de la cadena**
Diagrama esquemático de la cola de cadenaInserte la descripción de la imagen aquí
(2) Descripción de la cola de cadena
Similar a la cola secuencial, también encapsulamos estos dos punteros juntos y definimos el tipo de cola de enlace LinkQueue como un tipo de estructura:

typedef struct queuenode
      { datatype  data;
         struct queuenode *next;
       }queuenode;
   typedef struct
      {  queuenode  *front;
          queuenode  *rear;
       }Linkqueue;

3) Operaciones básicas implementadas en la cola de la cadena
1) Construir una cola vacía (cola vacía del nodo encabezado)

  void initqueue(Linkqueue  *q)
     { q.front=(queuenode *)malloc(sizeof(queuenode));
       q.rear=q.front
       q.front->next=q.rear->next= NULL;
     }

Inserte la descripción de la imagen aquí
2) Operación en
Inserte la descripción de la imagen aquí
cola Algoritmo de operación en cola

void inqueue(Linkqueue  *q,datatype  x)
     {queuenode *p
      p=(queuenode * )malloc(sizeof(queuenode));
      p–>data=x;
      p–>next=NULL;
      q.rear–>next=p;
      q.rear=p;
     }

3) Juicio de cola

int queueempty(Linkqueue  *q)
    {
      return (q.front->next= =NULL &&
                  q.rear->next= =NULL);
     }
  1. Operación de extracción Inserte la descripción de la imagen aquí
    4) Algoritmo de operación de extracción

Datatype dequeue (Linkqueue * q)
{
datatype x; queuenode * p
if (queueempty (q))
{printf ("Queue is empty"); return;}
p = q.front–> next;
x = p–> data;
q.front–> next = p–> next;
if (q.rear = = p) / delete the tail node /
q.rear = q.front;
free§;
return x;
}

Si tiene alguna pregunta, deje un mensaje y modifíquelo a tiempo

Publicó 10 artículos originales · ganó 12 · visitó 1856

Supongo que te gusta

Origin blog.csdn.net/qq_44236958/article/details/89167223
Recomendado
Clasificación