📜  使用模板类和循环数组实现动态队列

📅  最后修改于: 2021-09-04 11:38:20             🧑  作者: Mango

在本文中,我们将讨论如何使用具有以下功能的循环数组创建动态循环队列:

  • Front():从队列中获取最前面的项目。
  • Back():从队列中获取最后一项。
  • Push(X):在队列的末尾将队列中的X推送。
  • Pop():从队列中删除一个元素。

下面是分步说明:

  • 最初,队列是空的。

  • 将元素1插入到队列的后面。

  • 将元素2、3、4插入到队列的后面。

  • 将元素5插入到队列的后面。

  • 从队列中弹出 4 个元素。

  • 从队列中弹出 1 个元素。

方法:这个想法是在每次数组容量已满时将使用的数组大小加倍,并将前一个数组的元素复制到新数组中。请按照以下步骤解决问题:

  • 初始化 4 个变量,比如frontIndex、backIndex、sizeVarcapacity,还有一个数组比如arr[]来实现队列,
  • 定义一个函数say Capacity()来查找当前使用的数组的大小:
    • 返回容量
  • 定义一个函数say size()来查找队列中元素的数量:
    • 返回变量sizeVar。
  • 定义一个函数say full()来查找队列是否已满:
    • 如果sizeVar等于容量返回true。否则,返回false。
  • 定义一个函数say empty()来查找队列是否为空:
    • 如果frontIndexbackIndex等于-1,则返回 true。否则,返回false。
  • 定义一个函数say Front()来打印队列的前端元素:
    • 如果 queue 不是empty() ,则打印arr[frontIndex]的元素
  • 定义一个函数say Back()来打印队列的最后一个元素:
    • 如果队列不为空,则打印arr[BackIndex]的元素()。
  • 定义一个函数say Push(X)在队列末尾插入一个元素:
    • 如果队列已满,则将当前数组的大小加倍,并将前一个数组的元素复制到新数组中。
    • 如果 queue 为空(),则分配frontIndex = backIndex = 0 ,然后将X分配给arr[frontIndex]arr[backIndex] ,然后将sizeVar增加 1。
    • 否则,更新backIndexbackIndex =(backIndex + 1)%的容量,然后分配X由一个常用3 [backIndex]和增量sizeVar。
  • 定义一个函数say Pop()来删除队列前面的元素:
    • 如果队列为空,则打印“下溢”。
    • 否则,如果是sizeVar通过一个等于1,则分配-1frontIndexbackIndex两者结合,然后递减sizeVar。
    • 否则,更新frontIndexfrontIndex =(frontIndex + 1)%的容量和减量sizeVar由一个。

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
 
// Class defination for queue
template 
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 
int Queue::capacity()
{
    return capacityVar;
}
 
// Find the number of elements
// present in Queue
template 
int Queue::size()
{
    return sizeVar;
}
 
// Function to check if
// Queue is empty or not
template 
bool Queue::empty()
{
    if (frontIndex == -1
        && backIndex == -1)
        return true;
    else
        return false;
}
 
// Function to check if the queue
// is full or not
template 
bool Queue::full()
{
    if (sizeVar == capacityVar)
        return true;
    else
        return false;
}
 
// Function to find the front element
// of the queue
template 
X Queue::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 
X Queue::back()
{
    if (empty()) {
        cout << "Queue underflow"
             << endl;
        abort();
    }
    return arr[backIndex];
}
 
// Function to insert the element
// to the rear end of the queue
template 
void Queue::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
        for (int i = 0; i < sizeVar; i++)
            temp[i] = arr[i];
 
        // 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 
void Queue::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 q;
 
    // Iterate the range [1, 100]
    for (int i = 1; i < 100; 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;
 
    return 0;
}


输出:
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

时间复杂度: O(N)
辅助空间: O(N)

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live