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.
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
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 .
¿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*
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;
}
②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
**
Diagrama esquemático de la cola de cadena
(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;
}
2) Operación en
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);
}
- Operación de extracción
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