3

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 5 0 0 0 0

質問 1: 1. pop() 操作でアイテムを実際に削除するにはどうすればよいですか? 2. 私の実装は正しいですか?

ありがとう

4

2 に答える 2

0

実際には何も削除する必要はありません。queueFrontこれは循環キューで、 からに移動する必要がありますqueueBack。あなたの場合、最初はあなたのキューは1 2 3後でそれになりますが、あなたの位置を移動したので、あなたがポップした後2 3 5、配列の内容は以前と後で同じままでした。5 を押して後でキューを変更すると、配列の内容は になります。キューに印刷機能を実装することをお勧めします。これにより、物事が簡素化されるか、少なくとも配列の内容ではなくキューの内容を確認できるようになります。1 2 3 0 0 0 0 0queueFront1 2 3 5 0 0 0 0

実装に関する限り、最大値を取得できるため、わずかに軌道から外れています。キュー内の要素は 8 つではなく 7 つです (予想どおり)。配列内の((queueBack + 1 ) % arrayLength) == queueFront位置にいつ挿入するかを確認するためですqueueBack

于 2013-06-02T10:59:33.223 に答える