我正在尝试使用C ++中的数组实现一个简单的循环队列。以下是我的代码。
#include <iostream>
int pop();
void push(int );
const int arrayLength = 8;
int inputArray[arrayLength] = {0};
int queueFront=0,queueBack=0;
void push(int theElement)
{
//Check if the push causes queue to overflow
if (((queueBack + 1 ) % arrayLength) == queueFront)
{
std::cout<<"Queue is full."<<std::endl;
return ;
}
inputArray[queueBack] = theElement;
queueBack = (queueBack + 1) % arrayLength;
}
int pop()
{
//Check if queue is already empty
if ( queueFront == queueBack )
{
std::cout<<"Queue is empty."<<std::endl;
}
std::cout<<inputArray[queueFront]<<" removed."<<std::endl;
queueFront = (queueFront + 1 ) % arrayLength;
}
int main()
{
for ( int i =0; i < arrayLength; ++i)
{
std::cout<<inputArray[i]<<std::endl;
}
push(1);
push(2);
push(3);
pop();
push(5);
//printing arrayelements
for ( int i =0; i < arrayLength; ++i)
{
std::cout<<inputArray[i]<<std::endl;
}
}
我运行时得到以下输出:
0 0 0 0 0 0 0 0 1删除。 1 2 3 五 0 0 0 0
问题1: 1.我如何实际删除pop()操作中的项目? 2.我的实施是否正确?
由于
答案 0 :(得分:0)
鉴于pop()在确定队列为空后仍然改变队列,对#2的回答是“否”。
答案 1 :(得分:0)
您实际上不必删除任何内容。这是一个循环队列,您需要从queueFront
转到queueBack
。在您的情况下,最初您的队列为1 2 3
,之后它变为2 3 5
但阵列的内容为1 2 3 0 0 0 0 0
之前和之后,在您弹出后它们保持不变,因为您已移动了你的queueFront
。再次当你稍后修改队列时,通过按5,数组的内容变为1 2 3 5 0 0 0 0
。我建议您为队列实现一个打印功能,这样可以简化或者至少可以看到队列的内容而不是数组的内容。
就实施而言,它稍微偏离轨道,因为你可以获得最大值。队列中的7个元素,而不是8个(正如您所期望的那样)。这是因为当您在数组
中插入位置((queueBack + 1 ) % arrayLength) == queueFront
时检查queueBack