LeetCode temas de cola de cepillo

641. diseño del ciclo deque

El diseño y la implementación deque.
Es necesario para apoyar la implementación de las siguientes operaciones:
MyCircularDeque (K): Constructor, tamaño deque sea k. insertFront (): la adición de un elemento para la cabeza de la deque.
Devuelve verdadero si la operación se ha realizado correctamente. insertLast (): añadir un elemento a la cola de la deque. Devuelve verdadero si la operación se ha realizado correctamente.
deleteFront (): Borrar un elemento de cabeza desde el deque. Devuelve verdadero si la operación se ha realizado correctamente.
deleteLast (): elimina un elemento de la cola deque. Devuelve verdadero si la operación se ha realizado correctamente.
getFront (): Obtener un elemento de cabeza desde el deque. Si el deque está vacía, devuelve -1. getRear (): Obtener el último elemento de una deque.
Si el deque está vacía, devuelve -1. estaVacia (): Comprobar deque está vacío. isFull (): Comprobar si el deque está lleno. Ejemplo:

MyCircularDeque circularDeque = nuevo MycircularDeque (3) ; // ajustar el tamaño de la capacidad de 3.
CircularDeque.insertLast (1.); // devuelve a cierto
circularDeque.insertLast (2); // devuelve a cierto
circularDeque.insertFront (3.); // devuelve a cierto
circularDeque .insertFront (4); // completo, devolver false
circularDeque.getRear (); // devuelve circularDeque.isFull 2 ();
// devuelve verdadero circularDeque.deleteLast (); // retorno a la verdadera
circularDeque.insertFront (4) ; // devuelve a cierto
circularDeque.getFront (); // devuelve 4

consejos:

Todos los valores de la gama de [1, 1000] es el número de la gama de la operación [1, 1000] no utilice la incorporada en el deque biblioteca.

Fuente: estancia botón (LeetCode)
enlace: https: //leetcode-cn.com/problems/design-circular-deque
Dificultad: Media
propiedad de la deducción de todas las redes. reimpresión comercial póngase en contacto con la reimpresión autorizada oficial, no comercial por favor indique la fuente.


Pensamiento: este tema de diseño principio estaba un poco desconcertado, el primer contacto con la llamada cola de doble extremo. Pero la solución a un problema que vaya a ver una explicación clara de los elogios después de responder Dalao llamada deque circulares qué cosas.
Para resumir en la palabra: la cola, responsable trasera y delantera, son responsables de un uno (es decir, la gestión y por fuera), pero las responsabilidades compartidas deque trasera y delantera de. Esto nos dice que es importante para establecer el ciclo de hacer doble terminado cola de la cola sobre la base de condiciones, lo único que necesita para operar delantera y trasera de intercambio (es decir, ambos de los cuales se pueden gestionar a cabo). A continuación, el equipo condicional completa de equipo de vacío puede ser diseñado sobre la base de la cola.
Bueno, aquí está la estructura de almacenamiento secuencial, el tiempo y luego se distribuye a lograr estructura de almacenamiento.
Finalmente tuvo que suspiro, LeetCode en C ++ simplemente cosechar las ventajas, solución de alta calidad a un problema casi todos los C ++.

typedef struct MyCircularDeque 
{
    int front;
    int rear;
    int MAXSIZE;
    int data[];     //这是伸缩型数组成员,可以理解为动态数组,大小依据内存分配而定。不明白自行查阅
} MyCircularDeque;


bool myCircularDequeIsEmpty(MyCircularDeque* obj);
bool myCircularDequeIsFull(MyCircularDeque* obj);


/** Initialize your data structure here. Set the size of the deque to be k. */
MyCircularDeque* myCircularDequeCreate(int k) {
    MyCircularDeque* obj = (MyCircularDeque*)malloc(sizeof(MyCircularDeque) + (k + 1) * sizeof(int));
    if(!obj)
        return NULL;
    memset(obj, 0, sizeof(MyCircularDeque) + (k + 1) * sizeof(int));
    obj->MAXSIZE = k + 1;	//多分配了一个位置是为了方便队满队空的判断.

    return obj;
}

/** Adds an item at the front of Deque. Return true if the operation is successful. */
bool myCircularDequeInsertFront(MyCircularDeque* obj, int value) {
    if(myCircularDequeIsFull(obj))
        return false;

    obj->front = (obj->front - 1 + obj->MAXSIZE) % obj->MAXSIZE;
    obj->data[obj->front] = value;
    return true;
}

/** Adds an item at the rear of Deque. Return true if the operation is successful. */
bool myCircularDequeInsertLast(MyCircularDeque* obj, int value) {
    if(myCircularDequeIsFull(obj))
        return false;

    obj->data[obj->rear] = value;
    obj->rear = (obj->rear + 1) % obj->MAXSIZE;
    return true;
}

/** Deletes an item from the front of Deque. Return true if the operation is successful. */
bool myCircularDequeDeleteFront(MyCircularDeque* obj) {
    if(myCircularDequeIsEmpty(obj))
        return false;
    
    obj->front = (obj->front + 1) % obj->MAXSIZE;
    return true;
}

/** Deletes an item from the rear of Deque. Return true if the operation is successful. */
bool myCircularDequeDeleteLast(MyCircularDeque* obj) {  //OVER
    if(myCircularDequeIsEmpty(obj))
        return false;

     obj->rear = (obj->rear - 1 + obj->MAXSIZE) % obj->MAXSIZE;
     return true;
}

/** Get the front item from the deque. */
int myCircularDequeGetFront(MyCircularDeque* obj) { //OVER
    return myCircularDequeIsEmpty(obj) ? -1 : obj->data[obj->front];
}

/** Get the last item from the deque. */
int myCircularDequeGetRear(MyCircularDeque* obj) {  //OVER
    if(myCircularDequeIsEmpty(obj))
        return -1;

    int index = (obj->rear - 1 +obj->MAXSIZE) % obj->MAXSIZE;
    return obj->data[index];
}

/** Checks whether the circular deque is empty or not. */
bool myCircularDequeIsEmpty(MyCircularDeque* obj) { //OVER
    return obj->rear == obj->front ? true : false;
}

/** Checks whether the circular deque is full or not. */
bool myCircularDequeIsFull(MyCircularDeque* obj) {  //OVER
    return (obj->rear +1) % obj->MAXSIZE == obj->front ? true : false;
}

void myCircularDequeFree(MyCircularDeque* obj) {    //OVER
    free(obj);
    obj = NULL;
}

622. cola de ciclo de diseño

El diseño y la implementación deque. Es necesario apoyar la realización de las siguientes acciones:

MyCircularDeque (k): Constructor, tamaño deque sea k. insertFront (): la adición de un elemento para la cabeza de la deque.
Devuelve verdadero si la operación se ha realizado correctamente. insertLast (): añadir un elemento a la cola de la deque. Devuelve verdadero si la operación se ha realizado correctamente.
deleteFront (): Borrar un elemento de cabeza desde el deque. Devuelve verdadero si la operación se ha realizado correctamente.
deleteLast (): elimina un elemento de la cola deque. Devuelve verdadero si la operación se ha realizado correctamente.
getFront (): Obtener un elemento de cabeza desde el deque. Si el deque está vacía, devuelve -1. getRear (): Obtener el último elemento de una deque.
Si el deque está vacía, devuelve -1. estaVacia (): Comprobar deque está vacío. isFull (): Comprobar si el deque está lleno. Ejemplo:

MyCircularDeque circularDeque = nuevo MycircularDeque (3) ; // ajustar el tamaño de la capacidad de 3.
CircularDeque.insertLast (1.); // devuelve a cierto
circularDeque.insertLast (2); // devuelve a cierto
circularDeque.insertFront (3.); // devuelve a cierto
circularDeque .insertFront (4); // completo, devolver false
circularDeque.getRear (); // devuelve circularDeque.isFull 2 ();
// devuelve verdadero circularDeque.deleteLast (); // retorno a la verdadera
circularDeque.insertFront (4) ; // devuelve a cierto
circularDeque.getFront (); // devuelve 4

consejos:

Todos los valores de la gama de [1, 1000] es el número de la gama de la operación [1, 1000] no utilice la incorporada en el deque biblioteca.

Fuente: Botón de estancia (LeetCode)
Dificultad: Media
enlace: https: //leetcode-cn.com/problems/design-circular-deque
propiedad de la deducción de todas las redes. reimpresión comercial póngase en contacto con la reimpresión autorizada oficial, no comercial por favor indique la fuente.

Pensando: nada que decir. . .

typedef struct MyCircularDeque 
{
    int front;
    int rear;
    int MAXSIZE;
    int data[];     //这是伸缩型数组成员,可以理解为动态数组,大小依据内存分配而定。不明白自行查阅
} MyCircularDeque;


bool myCircularDequeIsEmpty(MyCircularDeque* obj);
bool myCircularDequeIsFull(MyCircularDeque* obj);


/** Initialize your data structure here. Set the size of the deque to be k. */
MyCircularDeque* myCircularDequeCreate(int k) {
    MyCircularDeque* obj = (MyCircularDeque*)malloc(sizeof(MyCircularDeque) + (k + 1) * sizeof(int));
    if(!obj)
        return NULL;
    memset(obj, 0, sizeof(MyCircularDeque) + (k + 1) * sizeof(int));
    obj->MAXSIZE = k + 1;

    return obj;
}

/** Adds an item at the front of Deque. Return true if the operation is successful. */
bool myCircularDequeInsertFront(MyCircularDeque* obj, int value) {
    if(myCircularDequeIsFull(obj))
        return false;

    obj->front = (obj->front - 1 + obj->MAXSIZE) % obj->MAXSIZE;
    obj->data[obj->front] = value;
    return true;
}

/** Adds an item at the rear of Deque. Return true if the operation is successful. */
bool myCircularDequeInsertLast(MyCircularDeque* obj, int value) {
    if(myCircularDequeIsFull(obj))
        return false;

    obj->data[obj->rear] = value;
    obj->rear = (obj->rear + 1) % obj->MAXSIZE;
    return true;
}

/** Deletes an item from the front of Deque. Return true if the operation is successful. */
bool myCircularDequeDeleteFront(MyCircularDeque* obj) {
    if(myCircularDequeIsEmpty(obj))
        return false;
    
    obj->front = (obj->front + 1) % obj->MAXSIZE;
    return true;
}

/** Deletes an item from the rear of Deque. Return true if the operation is successful. */
bool myCircularDequeDeleteLast(MyCircularDeque* obj) {  //OVER
    if(myCircularDequeIsEmpty(obj))
        return false;

     obj->rear = (obj->rear - 1 + obj->MAXSIZE) % obj->MAXSIZE;
     return true;
}

/** Get the front item from the deque. */
int myCircularDequeGetFront(MyCircularDeque* obj) { //OVER
    return myCircularDequeIsEmpty(obj) ? -1 : obj->data[obj->front];
}

/** Get the last item from the deque. */
int myCircularDequeGetRear(MyCircularDeque* obj) {  //OVER
    if(myCircularDequeIsEmpty(obj))
        return -1;

    int index = (obj->rear - 1 +obj->MAXSIZE) % obj->MAXSIZE;
    return obj->data[index];
}

/** Checks whether the circular deque is empty or not. */
bool myCircularDequeIsEmpty(MyCircularDeque* obj) { //OVER
    return obj->rear == obj->front ? true : false;
}

/** Checks whether the circular deque is full or not. */
bool myCircularDequeIsFull(MyCircularDeque* obj) {  //OVER
    return (obj->rear +1) % obj->MAXSIZE == obj->front ? true : false;
}

void myCircularDequeFree(MyCircularDeque* obj) {    //OVER
    free(obj);
    obj = NULL;
}

Resumen : Para este diseño de cohortes, la consideración principal es lo que el equipo se vacía, lo que el equipo está lleno, es evidente que el equipo cuando están vacíos y llenos equipo, cómo la posición de puntero trasero y delantero. Teniendo en cuenta estas condiciones, creemos que una cola no es difícil de diseñar.

Se han publicado 19 artículos originales · ganado elogios 2 · Vistas 2538

Supongo que te gusta

Origin blog.csdn.net/SC_king/article/details/104905739
Recomendado
Clasificación