Implemente una cola dinámica usando la clase de plantillas y una array circular

En este artículo, discutiremos cómo crear una cola circular dinámica utilizando una array circular que tiene la siguiente funcionalidad: 

  • Front(): obtiene el elemento frontal de la cola.
  • Atrás(): obtiene el último elemento de la cola.
  • Empuje (X): Empuje la X en la cola al final de la cola.
  • Pop(): Elimina un elemento de la cola.

A continuación se muestra la ilustración paso a paso:

  • Inicialmente, la cola está vacía.

  • Inserte el elemento 1 al final de la cola.

  • Inserte los elementos 2, 3, 4 al final de la cola.

  • Inserte los elementos 5 al final de la cola.

  • Pop 4 elementos de la cola.

  • Pop 1 elemento de la cola.

Enfoque: la idea es duplicar el tamaño de la array utilizada cada vez que la capacidad de la array se llena y copiar los elementos de la array anterior en la nueva array. Siga los pasos a continuación para resolver el problema:

  • Inicialice 4 variables, digamos frontIndex, backIndex, sizeVar y capacidad , y una array, digamos arr[] para implementar la cola,
  • Defina una función, digamos Capacity() para encontrar el tamaño de la array actual utilizada:
    • Devolver la capacidad .
  • Defina una función, digamos tamaño(), para encontrar el recuento de elementos en la cola:
    • Devuelve la variable sizeVar.
  • Defina una función diga full() para encontrar si la cola está llena o no:
    • Retorna verdadero si sizeVar es igual a capacidad . De lo contrario, devuelve falso.
  • Defina una función, diga vacío(), para encontrar si la cola está vacía o no:
    • Si frontIndex y backIndex son iguales a -1 , devuelve verdadero. De lo contrario, devuelve falso.
  • Defina una función, digamos Front() para imprimir el elemento frontal de la cola :
  • Defina una función, diga Atrás() para imprimir el último elemento de la cola :
    • Imprime el elemento de arr[BackIndex] si la cola no está vacía().
  • Defina una función, diga Push(X) para insertar un elemento al final de la cola:
    • Si la cola está llena , duplique el tamaño de la array actual y copie los elementos de la array anterior en la nueva array.
    • Si la cola está vacía() , asigne frontIndex = backIndex = 0 y luego asigne X tanto a arr[frontIndex] como a arr[backIndex] y luego incremente sizeVar en uno.
    • De lo contrario, actualice backIndex como backIndex = (backIndex+1)%capacity y luego asigne X a arr[backIndex] e incremente sizeVar en uno.
  • Defina una función, diga Pop(), para eliminar un elemento al principio de la cola:
    • Si la cola está vacía, imprima «Subdesbordamiento».
    • De lo contrario, si sizeVar es igual a 1 , entonces asigne -1 a frontIndex y backIndex ambos y luego disminuya sizeVar en uno.
    • De lo contrario, actualice frontIndex como frontIndex = (frontIndex+1)%capacity y disminuya sizeVar en uno.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Class defination for queue
template <class X>
class Queue {
 
private:
    // Stores the frontIndex
    int frontIndex;
 
    // Stores the back Index
    int backIndex;
 
    // Stores the array
    X* arr;
 
    // Stores the sizeof queue
    int sizeVar;
 
    // Stores the size of array
    int capacityVar = 4;
 
public:
    // Queue class constructor
    Queue()
    {
        arr = new X[capacityVar];
        frontIndex = backIndex = -1;
        sizeVar = 0;
    }
 
    // Function Methods
    bool empty();
    bool full();
    void push(X x);
    void pop();
    X front();
    X back();
    int capacity();
    int size();
};
 
// Find the capacity of queue
template <class X>
int Queue<X>::capacity()
{
    return capacityVar;
}
 
// Find the number of elements
// present in Queue
template <class X>
int Queue<X>::size()
{
    return sizeVar;
}
 
// Function to check if
// Queue is empty or not
template <class X>
bool Queue<X>::empty()
{
    if (frontIndex == -1
        && backIndex == -1)
        return true;
    else
        return false;
}
 
// Function to check if the queue
// is full or not
template <class X>
bool Queue<X>::full()
{
    if (sizeVar == capacityVar)
        return true;
    else
        return false;
}
 
// Function to find the front element
// of the queue
template <class X>
X Queue<X>::front()
{
    // If queue is empty
    if (empty()) {
        cout << "Queue underflow"
             << endl;
        abort();
    }
 
    return arr[frontIndex];
}
 
// Function to find the last element
// of the Queue
template <class X>
X Queue<X>::back()
{
    if (empty()) {
        cout << "Queue underflow"
             << endl;
        abort();
    }
    return arr[backIndex];
}
 
// Function to insert the element
// to the rear end of the queue
template <class X>
void Queue<X>::push(X x)
{
    if (full()) {
 
        // If the queue is full, then
        // double the capacity
        capacityVar = capacityVar * 2;
 
        // Initialize new array of
        // double size
        X* temp = new X[capacityVar];
 
        // Copy the elements of the
        // previous array in the order of the queue
        for (int i = 0, j= frontIndex; i < sizeVar; i++){
          temp[i] = arr[j];
          j = (j+1) % sizeVar;
        }
        // update the front and rear indices in the new array
          frontIndex = 0;
          backIndex =  sizeVar -1;
 
        // Deallocate the memory
        // of previous array
        delete[] arr;
        arr = temp;
    }
 
    // If size is zero
    if (empty()) {
 
        frontIndex = backIndex = 0;
        arr[backIndex] = x;
        sizeVar++;
        return;
    }
 
    // Increment the backIndex
    backIndex = (backIndex + 1) % capacityVar;
    arr[backIndex] = x;
    sizeVar++;
 
    return;
}
 
// Function to pop an element from
// front end of the queue
template <class X>
void Queue<X>::pop()
{
    // If queue is empty
    if (empty()) {
        cout << "Queue underflow"
             << endl;
        abort();
    }
 
    // If there is only one character
    if (frontIndex == backIndex) {
 
        // Mark Queue as empty
        // and decrement sizeVar
        frontIndex = backIndex = -1;
        sizeVar--;
        return;
    }
 
    // Increment frontIndex cyclically
    // using modulo arithmetic
    frontIndex = (frontIndex + 1) % capacityVar;
    sizeVar--;
 
    return;
}
 
// Driver Code
int main()
{
    // Queue initialization
    Queue<int> q;
 
    // Iterate the range [1, 100]
    for (int i = 1; i < 5; i++)
        q.push(i);
 
    // Print the current capacity
    cout << "Current capacity "
        << q.capacity() << endl;
 
    // Print current size
    cout << "Current size "
        << q.size() << endl;
 
    // Print front elements of queue
    cout << "Front element "
        << q.front() << endl;
 
    // Print last element of the queue
    cout << "Rear element "
        << q.back() << endl;
 
    cout << endl;
 
    cout << "Pop an element" << endl;
 
    // Pop an element from the queue
    q.pop();
 
    cout << "Pop an element" << endl;
 
    // Pop an element from the queue
    q.pop();
 
    cout << endl;
 
    // Print the current capacity
    cout << "Current capacity "
        << q.capacity() << endl;
 
    // Print current size
    cout << "Current size "
        << q.size() << endl;
 
    // Print front elements of queue
    cout << "Front element "
        << q.front() << endl;
 
    // Print last element of the queue
    cout << "Rear element "
        << q.back() << endl;
         
        cout << endl;
    cout << "Push element 5" << endl;
    cout << "Push element 6" << endl;
     
     
    q.push(5);
    q.push(6);
    cout << endl;
 
    // Print the current capacity
    cout << "Current capacity "
        << q.capacity() << endl;
 
    // Print current size
    cout << "Current size "
        << q.size() << endl;
 
    // Print front elements of queue
    cout << "Front element "
        << q.front() << endl;
 
    // Print last element of the queue
    cout << "Rear element "
        << q.back() << endl;
 
    cout << endl;
    cout << "Push element 7" << endl;
    q.push(7);
     
    cout << endl;
 
    // Print the current capacity
    cout << "Current capacity "
        << q.capacity() << endl;
 
    // Print current size
    cout << "Current size "
        << q.size() << endl;
 
    // Print front elements of queue
    cout << "Front element "
        << q.front() << endl;
 
    // Print last element of the queue
    cout << "Rear element "
        << q.back() << endl;
 
    return 0;
}
Producción: 

Current capacity 128
Current size 99
Front element 1
Rear element 99

Pop an element
Pop an element

Current capacity 128
Current size 97
Front element 3
Rear element 99

 

Complejidad temporal: O(N)
Espacio auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por shaadk7865 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *