Javaでのキューの配列とリンクリストの実装

王林
リリース: 2019-11-28 13:44:59
転載
1813 人が閲覧しました

Javaでのキューの配列とリンクリストの実装

Queue の概要

Queue は先入れ先出し (FIFO) 線形データ構造です。キューの主な操作は次のとおりです。キューに参加してキューから外すことです。

キューの先頭: キューの出口端、キューの末尾: キューの入口端。通常、キューに入力された最後の要素の次の位置として配列で表されます。

配列を使用して実装する場合は、次の点に注意してください。要素がキューの先頭でデキューされ続けると、キューの利用可能なスペースが小さくなるため、通常は循環キューを使用して実装します。このとき、列の最後尾が列の先頭より前に現れることもあります。

推奨される関連学習ビデオ チュートリアル: java 学習

キュー配列の実装

キュー配列の実装はこちら キュー通常、循環行列になります。

特記事項:

(1) キューが満杯の場合の判定条件は、 (キュー末尾の添字 1) % 配列長 = キュー先頭の添字

(2) キューテールポインタの指す位置には空きが 1 つあるため、キューの最大容量は配列長から 1 引いた値となります。

public class MyQueue {
    private int[] array;
    private int front;
    private int rear;
    public MyQueue(int capacity){
        array = new int[capacity];
    }
 
    /*
    入队时,只需判断队列是否已满,若队列已满,则抛出异常,其他情况(包括队列为空)都正常插入
     */
    public void enQueue(int data) throws Exception{
        if((rear+1) % array.length  == front)
            throw new Exception("队列已满,不能入队!");
        array[rear] = data;
        rear = (rear+1) % array.length;
    }
 
    /*
    出队时,判断队列是否为空,若队列为空,抛出异常
     */
    public int deQueue() throws Exception{
        if(front == rear)
            throw new Exception("队列为空,不能出队!");
        int temp = array[front];
        front = (front+1) % array.length;
        return temp;
    }
 
//    public void output(){
//        for(int i = front; ((i+1) % array.length) <= rear; i++){
//一直在循环输出,严重错误!不能把取模判断语句写在条件里面!
//            i %= array.length;
//            System.out.println(array[i]);
//        }
//    }
 
    public void output(){
        for(int i = front; i != rear; i = (i+1) % array.length){
            System.out.println(array[i]);
        }
    }
    public static void main(String[] args) throws Exception{
        MyQueue myQueue = new MyQueue(5);//长度为5的队列只能插入4个元素
        myQueue.enQueue(1);
        myQueue.enQueue(3);
        myQueue.enQueue(2);
        myQueue.enQueue(4);
        myQueue.deQueue();
        myQueue.deQueue();
        myQueue.enQueue(5);
        myQueue.enQueue(6);
        myQueue.output();
    }
 
}
ログイン後にコピー

キューのリンク リストの実装

キューがリンク リストを使用して実装されている場合、ヘッド ポインタを使用して次を指します。キューの最初のノードを使用し、末尾ポインタはキューの最後のノードを指します。

public class MyQueue_LinkList {
    private static class Node{
        int data;
        Node next;
        Node(int data){
            this.data = data;
        }
    }
 
    private Node front;
    private Node rear;
    private int size;//队列中实际元素的个数
    private int maxsize;
 
    public MyQueue_LinkList(int capacity){
        maxsize = capacity;
    }
 
    public void enQueue(int data) throws Exception{
        if(size >= maxsize)
            throw new Exception("队列已满,无法入队");
        Node insertedNode = new Node(data);
        if(size == 0){
            front = insertedNode;
            rear = insertedNode;
        }
        else{
            rear.next = insertedNode;
            rear = insertedNode;
        }
        size++;
    }
 
    public int deQueue() throws Exception{
        if(front == null)
            throw new Exception("队列为空,无法出队!");
        int temp;
        if(front == rear)//队列中只有一个节点
            rear = null;
        temp = front.data;
        front = front.next;
        size--;
        return temp;
    }
 
    public void output(){
        Node temp = front;
        for(int i = 0 ; i < size; i++){
            System.out.println(temp.data);
            temp = temp.next;
        }
    }
 
    public static void main(String[] args) throws Exception{
        MyQueue_LinkList myQueue_linkList = new MyQueue_LinkList(5);
        myQueue_linkList.enQueue(1);
        myQueue_linkList.enQueue(3);
        myQueue_linkList.enQueue(2);
        myQueue_linkList.deQueue();
        myQueue_linkList.deQueue();
        myQueue_linkList.enQueue(5);
        myQueue_linkList.enQueue(7);
        myQueue_linkList.output();
 
    }
}
ログイン後にコピー

キュー アプリケーション シナリオ

(1) 銀行キュー、先着順。

(2) マルチスレッドでは、公平なロックを競合する待機キューが、アクセス順序に従ってキュー内のスレッドの順序を決定します。

(3) Web クローラーは、クロール対象の Web サイトの URL をキューに格納し、キューに格納された順序でクロールおよび解析することにより、Web サイトのクローリングを実装します。

おすすめの関連記事とチュートリアル: Java 入門チュートリアル

以上がJavaでのキューの配列とリンクリストの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート