データ構造:javaのキュー

注文キュー

コンセプト:

队列是一种先进先出的线性表,只允许在一端插入,另一端删除。允许插入的一端称为队尾,允许删除的一端称为队头

注文キュー実装:

import org.junit.jupiter.api.Test;

/**
 *   顺序队列
 * @author wydream
 *
 */

public class QueueSequence {

    private String[] arr;//队列数组
    private int end=0;//队尾标志

    //向队列中添加元素
    public void push(String[] arr,String value) {
        if(end<arr.length) {
            arr[end]=value;
            end++;
            return;
        }else {
            System.out.println("队列已经满了");
            return;
        }

    }

    //取出队列元素
    public String pop(String[] arr) {
        String rs;
        if(arr[0]==null) {
            System.out.println("队列为空,请先向队列中添加元素");
            return null;
        }else {
            rs=arr[0];
            arr[0]=null;
            move(arr);
            return rs;
        }
    }

    //队列元素向前移动
    public void move(String[] arr) {
        for(int i=0;i<arr.length-1;i++) {
            if(arr[i+1]!=null) {
                arr[i]=arr[i+1];
            }else{
                arr[i]=null;
                break;
            }
        }
    }




    @Test
    public void test() {
        String[] arr=new String[10];
        push(arr,"北京");
        push(arr,"上海");
        push(arr,"广东");
        push(arr,"杭州");
        push(arr,"苏州");
        push(arr,"扬州");
        pop(arr);
        pop(arr);
        pop(arr);
        pop(arr);
    }

}

循環キュー

コンセプト:

  • キューの欠如:順次挿入動作時キューは、直接尾部に挿入することができ、また、このときに複雑さはO(1)であるが、最初のチームに記載されている、添字の位置すなわち0キューのすべての要素が前方に移動しなければならないことを意味するが、この時間の時間複雑度は、あまり効率的で0(N)です。
  • ポインタを移動するには、列リストのすべての要素は、二つのポインタの導入にヘッド素子の前面を指す最初のポインタを移動するために必要とされていないチームは、リアテールポインタポイント尾要素に、これだけの時間列リストチーム。この場合にはオーバーフロー状態(以下を参照)のいずれかの種類が存在するであろうし、いずれの場合にも存在キュー要素に部屋を格納することが可能であるが、テールポインタがオーバーフローしたので、循環待ち行列があります。
    ここに画像を挿入説明
    ここに画像を挿入説明
  • 末尾の次の場所にフロント、リアポイントを指しHOL;チームの空の判断:フロントREAR;フル決意するためのチーム:(1 +リア)%MAXSIZEフロント

サイクルキューを達成するために:

/**
 *   java实现循环队列
 * @author wydream
 *
 */

import org.junit.jupiter.api.Test;

public class QueueArray {

    Object[] arr=new Object[10];;//对象数组,队列最多存储a.length-1个对象 
    int front=0;//队首下标
    int rear=0;//队尾下标

    /**
     *  将一个对象追加到队列尾部
     */
    public boolean enqueue(Object obj) {
        if((rear+1)%arr.length==front) {
            return false;
        }
        arr[rear]=obj;
        rear=(rear+1)%arr.length;
        return true;

    }

    //出队列
    public Object dequeue() {
        if(rear==front) {
            return null;
        }
        Object obj=arr[front];
        front=(front+1)%arr.length;
        return obj;
    }

    @Test
    public void test() {
        QueueArray q=new QueueArray();
        System.out.println(q.enqueue("北京"));
        System.out.println(q.enqueue("上海"));
        System.out.println(q.enqueue("广东"));
        System.out.println(q.enqueue("深圳"));
        for(int i=0;i<4;i++){   
            System.out.println(q.dequeue());   
        }   
    }
}
公開された156元の記事 ウォンの賞賛8 ビュー20000 +

おすすめ

転載: blog.csdn.net/weixin_42590334/article/details/103635130