Cola - estructura de datos Yan Weimin versión de lenguaje C

definicion de cola

Cola: una lista lineal de primero en entrar, primero en salir Una
cola es una lista lineal que solo se inserta al final de la cola y elimina al principio de la cola

  • Encabezado de la cola (frontal): el extremo de la cabeza de la tabla lineal, puede eliminar el final
  • Trasero: el extremo trasero de la mesa lineal, que se puede insertar en el extremo

inserte la descripción de la imagen aquí
Dado que hay un fenómeno de desbordamiento falso en esta cola, se introduce una lista enlazada circular para resolver la imaginación de desbordamiento falso

Qué es el desbordamiento falso puede consultar este artículo

cola circular

inserte la descripción de la imagen aquí
Dos formas de distinguir si una cola circular está llena o vacía

  • Se establece otra bandera para distinguir si la cola está llena o vacía.
  • Usar un espacio de elemento menos
    Condición para equipo vacío: Q.front == Q.rear Condición
    para equipo completo: (Q.rear+1)%MAXSIZE == Q.front

Usamos la segunda forma de lograr
inserte la descripción de la imagen aquí

Operaciones básicas de colas circulares

#include <iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 10
using namespace std;
typedef int Status;
typedef int QElemType;

typedef struct {
    
    
    QElemType *base;//存储空间的基地址
    int front;//头指针
    int rear;//尾指针
}SqQueue;

/*初始化队列
	1、为队列分配最大容量为MAXSIZE的数组空间,base指向数组空间的首地址
	2、头指针和尾指针置为0,表示队列为空
*/
Status InitQueue(SqQueue &Q){
    
    
    Q.base = new QElemType[MAXSIZE];
    if (!Q.base) exit(OVERFLOW);//存储空间分配失败
    Q.front = Q.rear = 0;//头尾指针置零
    return OK;
}
/*队列的长度(队列中元素的个数)*/
int QueueLength(SqQueue Q){
    
    
    return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
/*循环队列入队
	1、判断队列是否已满,若满则返回ERROR
	2、将新元素插入到队尾
	3、队尾指针加1
*/
Status EnQueue(SqQueue &Q,QElemType e){
    
    
    if ((Q.rear+1)%MAXSIZE == Q.front) //(循环)队列满了
        return ERROR;
    Q.base[Q.rear] = e;//在队尾插入元素
    Q.rear = (Q.rear+1)%MAXSIZE;//队尾指针加1
    return OK;
}
/*循环队列出队
	1、判断队列是否为空,若空则返回ERROR
	2、保存队头元素
	3、队头指针加1
*/
Status DeQueue(SqQueue &Q,QElemType &e){
    
    
    if (Q.front == Q.rear)//对空
        return ERROR;
    e = Q.base[Q.front];
    Q.front = (Q.front+1)%MAXSIZE;//对头指针加1
    return OK;
}
/*取循环队列的队头元素*/
QElemType GetHead(SqQueue Q){
    
    
    if (Q.front != Q.rear)
        return Q.base[Q.front];
}

int main(){
    
    
    SqQueue Q;
    InitQueue(Q);//初始化循环队列
    EnQueue(Q,1);//循环队列入队
    EnQueue(Q,2);
    EnQueue(Q,3);
    int length = QueueLength(Q);
    cout<<length<<endl;
    cout<<GetHead(Q)<<endl;
    int a,b,c;
    DeQueue(Q,a);//循环队列出队
    DeQueue(Q,b);
    DeQueue(Q,c);
    cout<<a<<b<<c<<endl;
    return 0;
}

equipo de cadena

Una cola en cadena se refiere a una cola implementada con una estructura de almacenamiento en cadena. Por lo general, el equipo de la cadena está representado por una lista de enlaces simples. Un equipo de la cadena obviamente necesita dos punteros a la cabeza y la cola del equipo para determinarse de manera única.
inserte la descripción de la imagen aquí

El funcionamiento básico del equipo de la cadena.

inserte la descripción de la imagen aquí

#include <iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 10;
using namespace std;
typedef int Status;
typedef int QElemType;

typedef struct QNode{
    
    
    QElemType data;
    struct QNode *next;
}QNode,*QueuePtr;

typedef struct{
    
    
    QueuePtr front;//头指针
    QueuePtr rear;//尾指针
}LinkQueue;

/*链对的初始化
	1、生成新结点作为头结点,队头和队尾指针都指向此结点
	2、头节点的指针域置空
*/
Status InitQueue(LinkQueue &Q){
    
    
    Q.front = Q.rear = new QNode;
    Q.front->next = NULL;
    return OK;
}
/*链队入队
	1、为入队元素分配结点空间,用指针p指向
	2、将新结点的数据与置为e
	3、将新结点插入到队尾
	4、修改队尾指针指向p
*/
Status EnQueue(LinkQueue &Q,QElemType e){
    
    
    QueuePtr p = new QNode;
    p->data = e;
    p->next = NULL;
    Q.rear->next = p;//修改尾指针
    Q.rear = p;
    return OK;
}
/*链队出队
	1、判断队列是否为空,若空则返回ERROR
	2、临时保存队头的元素空间,已备释放
	3、修改队头指针指向下一个结点
	4、判断出队元素是否为最后一个元素,若是则将队尾指针指向头结点
	5、释放原队头元素的空间
*/
Status DeQueue(LinkQueue &Q,QElemType &e){
    
    
    if (Q.rear == Q.front) //链队为空
        return ERROR;
    QueuePtr p = Q.front->next;
    e = p->data;
    Q.front->next = p->next;//修好头指针
    if (Q.rear == p) //删除最后一个元素
        Q.rear = Q.front;
    delete p;
    return OK;
}
/*取链队的队头元素*/
QElemType GetHead(LinkQueue Q){
    
    
    if (Q.front != Q.rear)
        return Q.front->next->data;
}

int main(){
    
    
    LinkQueue Q;
    InitQueue(Q);
    EnQueue(Q,3);
    EnQueue(Q,2);
    EnQueue(Q,1);
    int a,b,c;
    DeQueue(Q,a);
    DeQueue(Q,b);
    DeQueue(Q,c);
    cout<<a<<b<<c<<endl;
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/m0_60117382/article/details/123788056
Recomendado
Clasificación