循環キューを設計する

循環キューの実装を設計します。循環キューは線形データ構造であり、そのパフォーマンスはFIFO(先入れ先出し)の原則に基づいており、キューの末尾がキューの先頭の後に接続されてループを形成します。「リングバッファ」とも呼ばれます。

循環キューの1つの利点は、以前このキューで使用されていたスペースを使用できることです。通常のキューでは、キューがいっぱいになると、キューの前にまだスペースがある場合でも、次の要素を挿入できません。しかし、循環キューを使用すると、これらのスペースを使用して新しい値を格納できます。

実装では、次の操作をサポートする必要があります。

  • MyCircularQueue(k):コンストラクター、キューの長さをkに設定します。
  • Front:チームのトップから要素を取得します。キューが空の場合、-1が返されます。
  • Rear:テール要素を取得します。キューが空の場合、-1が返されます。
  • enQueue(value):循環キューに要素を挿入します。成功した場合はtrueを返します。
  • deQueue():循環キューから要素を削除します。正常に削除された場合はtrueを返します。
  • isEmpty()処置:循環キューが空かどうかを確認してください。
  • isFull()処置:循環キューがいっぱいかどうかを確認してください。
  • 実装のアイデア:ヘッドポインターとテールポインターの初期位置は-1で、最初の要素がエンキューされるとき、テール++の後にテールを同時に0に設定します。
  • フォームの頭、尾のポインタは常にそれぞれ頭と尾の要素を指します。デキュー操作を実行し、コンテナに要素が1つしかない場合、
  • ヘッドとテールの両方がこの要素を指します。これは、チームに参加した後、要素が1つしかないポイントに対応します。だからコンテナがラウンドを実行するとき
  • チームに出入りした後、要素はなく、2つのポインターを初期状態に設定します。
  • クラスMyCircularQueue {
       
        private int [] data;
        プライベートintヘッド。
        プライベートintテール。
        プライベート整数サイズ。
        / **ここでデータ構造を初期化します。キューのサイズをkに設定します。* /
        public MyCircularQueue(int k){
            data = new int [k];
            頭= -1;
            テール= -1;
            サイズ= k;
        }
       
        / **循環キューに要素を挿入します。操作が成功した場合はtrueを返します。* /
        public boolean enQueue(int value){
            if(isFull()== true){
                return false;
            }
            if(isEmpty()== true){
                head = 0;
            }
            テール=(テール+ 1)%サイズ;
            data [tail] = value;
            trueを返します。
        }
       
        / **循環キューから要素を削除します。操作が成功した場合はtrueを返します。* /
        public boolean deQueue(){
            if(isEmpty()== true){
                return false;
            }
            if(head == tail){
                head = -1;
                テール= -1;
                trueを返します。
            }
            head =(head + 1)%size;
            trueを返します。
        }
       
        / **キューから先頭のアイテムを取得します。* /
        public int Front(){
            if(isEmpty()== true){
                return -1;
            }
            return data [head];
        }
       
        / **キューから最後のアイテムを取得します。* /
        public int Rear(){
            if(isEmpty()== true){
                -1を返す;
            }
            return data [tail];
        }
       
        / **循環キューが空かどうかを確認します。* /
        public boolean isEmpty(){
            return head == -1;
        }
       
        / **循環キューがいっぱいかどうかを確認します。* /
        public boolean isFull(){
            return((tail + 1)%size)== head;
        }
    }
    / **
     * MyCircularQueueオブジェクトはインスタンス化され、次のように呼び出されます。
     * MyCircularQueue obj = new MyCircularQueue(k);
     *ブール値param_1 = obj.enQueue(value);
     *ブール値param_2 = obj.deQueue();
     * int param_3 = obj.Front();
     * int param_4 = obj.Rear();
     *ブール値param_5 = obj.isEmpty();
     *ブール値param_6 = obj.isFull();
     * /
     
      

     

おすすめ

転載: www.cnblogs.com/szzla/p/12677783.html