删除队列的数组实现会降低容量?
Deletion in array implementation of queues reduces capacity?
在我见过的所有队列数组实现中,当它们'pop an element from front'时,它们基本上是将队列的前面标记更改为下一个元素。但随后队列的容量在技术上减少了(因为使用了数组)。这怎么还没有引起问题,或者这怎么被认为有效?
编辑:https://www.softwaretestinghelp.com/queue-in-cpp/
以这个link中的例子为例。当我们执行出队操作时,我们将front的指针更改为下一个元素。从这一点开始,我们执行的任何操作都将以数组的第 2 个位置作为前面的元素来完成。现在,如果我们继续将元素添加到队列的全部容量中,我们将得到最大数量。我们可以放入队列的元素的数量将比数组的容量(我们之前定义的)少 1。
您对文章 https://www.softwaretestinghelp.com/queue-in-cpp/ 中给出的 C++ 实现的关注是正确的。通过该实现,基本上当您使元素出列时,指向队列“第一个”的指针向右移动 1 个单位(在底层数组中),从而减少队列的容量。
实现这种队列的正确方法应该类似于那篇文章中提供的 Java 实现。如您所见,每个数组索引都是 pre-processed 和 % this.max_size
。这使得数组访问变得“循环”,即当我们访问索引k >= this.max_size
时,真正的数组索引又回到了范围[0, this.max_size - 1]
。结果,底层数组中的所有槽都被使用,这使得队列的容量在出队或入队操作后保持不变。
这是 C++ 实现的更正版本。
#include <iostream>
#define MAX_SIZE 5
using namespace std;
class Queue
{
private:
int myqueue[MAX_SIZE], front, rear;
public:
Queue ()
{
front = -1;
rear = -1;
}
bool isFull ()
{
if ((rear - front + MAX_SIZE) % MAX_SIZE == MAX_SIZE - 1)
{
return true;
}
return false;
}
bool isEmpty ()
{
if (front == -1)
return true;
else
return false;
}
void enQueue (int value)
{
if (isFull ())
{
cout << endl << "Queue is full!!";
}
else
{
if (front == -1)
front = 0;
rear++;
myqueue[rear % MAX_SIZE] = value;
cout << value << " ";
}
}
int deQueue ()
{
int value;
if (isEmpty ())
{
cout << "Queue is empty!!" << endl;
return (-1);
}
else
{
value = myqueue[front % MAX_SIZE];
if (front >= rear)
{ //only one element in queue
front = -1;
rear = -1;
}
else
{
front++;
}
cout << endl << "Deleted => " << value << " from myqueue";
return (value);
}
}
/* Function to display elements of Queue */
void displayQueue ()
{
int i;
if (isEmpty ())
{
cout << endl << "Queue is Empty!!" << endl;
}
else
{
cout << endl << "Front = " << front;
cout << endl << "Queue elements : ";
for (i = front; i <= rear; i++)
cout << myqueue[i % MAX_SIZE] << "\t";
cout << endl << "Rear = " << rear << endl;
}
}
};
int
main ()
{
Queue myq;
myq.deQueue (); //deQueue
cout << "Queue created:" << endl;
myq.enQueue (10);
myq.enQueue (20);
myq.enQueue (30);
myq.enQueue (40);
myq.enQueue (50); //enqueue 60 => queue is full
myq.enQueue (60);
myq.displayQueue ();
//deQueue =>removes 10, 20
myq.deQueue ();
myq.deQueue ();
//queue after dequeue
myq.displayQueue ();
myq.enQueue (70);
myq.enQueue (80);
myq.enQueue (90); //enqueue 90 => queue is full
myq.displayQueue ();
return 0;
}
在我见过的所有队列数组实现中,当它们'pop an element from front'时,它们基本上是将队列的前面标记更改为下一个元素。但随后队列的容量在技术上减少了(因为使用了数组)。这怎么还没有引起问题,或者这怎么被认为有效?
编辑:https://www.softwaretestinghelp.com/queue-in-cpp/ 以这个link中的例子为例。当我们执行出队操作时,我们将front的指针更改为下一个元素。从这一点开始,我们执行的任何操作都将以数组的第 2 个位置作为前面的元素来完成。现在,如果我们继续将元素添加到队列的全部容量中,我们将得到最大数量。我们可以放入队列的元素的数量将比数组的容量(我们之前定义的)少 1。
您对文章 https://www.softwaretestinghelp.com/queue-in-cpp/ 中给出的 C++ 实现的关注是正确的。通过该实现,基本上当您使元素出列时,指向队列“第一个”的指针向右移动 1 个单位(在底层数组中),从而减少队列的容量。
实现这种队列的正确方法应该类似于那篇文章中提供的 Java 实现。如您所见,每个数组索引都是 pre-processed 和 % this.max_size
。这使得数组访问变得“循环”,即当我们访问索引k >= this.max_size
时,真正的数组索引又回到了范围[0, this.max_size - 1]
。结果,底层数组中的所有槽都被使用,这使得队列的容量在出队或入队操作后保持不变。
这是 C++ 实现的更正版本。
#include <iostream>
#define MAX_SIZE 5
using namespace std;
class Queue
{
private:
int myqueue[MAX_SIZE], front, rear;
public:
Queue ()
{
front = -1;
rear = -1;
}
bool isFull ()
{
if ((rear - front + MAX_SIZE) % MAX_SIZE == MAX_SIZE - 1)
{
return true;
}
return false;
}
bool isEmpty ()
{
if (front == -1)
return true;
else
return false;
}
void enQueue (int value)
{
if (isFull ())
{
cout << endl << "Queue is full!!";
}
else
{
if (front == -1)
front = 0;
rear++;
myqueue[rear % MAX_SIZE] = value;
cout << value << " ";
}
}
int deQueue ()
{
int value;
if (isEmpty ())
{
cout << "Queue is empty!!" << endl;
return (-1);
}
else
{
value = myqueue[front % MAX_SIZE];
if (front >= rear)
{ //only one element in queue
front = -1;
rear = -1;
}
else
{
front++;
}
cout << endl << "Deleted => " << value << " from myqueue";
return (value);
}
}
/* Function to display elements of Queue */
void displayQueue ()
{
int i;
if (isEmpty ())
{
cout << endl << "Queue is Empty!!" << endl;
}
else
{
cout << endl << "Front = " << front;
cout << endl << "Queue elements : ";
for (i = front; i <= rear; i++)
cout << myqueue[i % MAX_SIZE] << "\t";
cout << endl << "Rear = " << rear << endl;
}
}
};
int
main ()
{
Queue myq;
myq.deQueue (); //deQueue
cout << "Queue created:" << endl;
myq.enQueue (10);
myq.enQueue (20);
myq.enQueue (30);
myq.enQueue (40);
myq.enQueue (50); //enqueue 60 => queue is full
myq.enQueue (60);
myq.displayQueue ();
//deQueue =>removes 10, 20
myq.deQueue ();
myq.deQueue ();
//queue after dequeue
myq.displayQueue ();
myq.enQueue (70);
myq.enQueue (80);
myq.enQueue (90); //enqueue 90 => queue is full
myq.displayQueue ();
return 0;
}