【发布时间】:2023-03-03 03:24:01
【问题描述】:
我正在尝试实现一个简单的循环队列操作,如下所示
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 ;
}
queueBack = (queueBack + 1) % arrayLength;
inputArray[queueBack] = theElement;
}
int pop()
{
//Check if queue is already empty
if ( queueFront == queueBack ) {
std::cout<<"Queue is empty."<<std::endl;
return;
}
queueFront = (queueFront + 1 ) % arrayLength;
return inputArray[queueFront];
}
考虑到最初 queueFront = 0 和 queueBack = 0, 上面的代码会导致一个完整的队列,即使实际上不是。我该如何纠正?在第一种情况下我的实现是否正确?
测试用例 最初arrayLength = 3,queueFront = 0,queueBack = 0;
在第一次调用 push(1) 结束时; queueFront = 0 , queueBack = 1 , 1 被添加到 inputArray[1] 而不是 0;
在第二次调用 push(2) 结束时,queueFront = 0, queueBack = 2, , 2 被添加到 inputArray[2],
现在,(queueBack + 1) % arrayLength == queueFront 为真,而还剩下一个空白空间,即 inputArray[0]。
谢谢
【问题讨论】:
-
你能用一些输入值解释这段代码有什么问题吗?你的意思是当它没有满时它会给出完整的队列?
-
当您使用 c++ 时,您应该将功能封装到一个类中,而不是使用全局变量。即使在 C 中为此使用全局变量也是一种糟糕的风格。
-
同意@MichaelWalz,但让我们暂时忘记复杂性。我想先想出正确的逻辑。
-
正如您在第 1 点下的问题中解释的那样,1 被添加到 inputArray[1] 而不是 inputArray[0],这很明显,之前 yun 增加了 queueBack。
-
我刚刚注意到您的变量名称是非标准的。通常情况下,queueFront 在推送项目时被推进,而 queueBack 在项目被弹出时推进,即后面跟随前面。