大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 詳解4種隊列實現方式

詳解4種隊列實現方式

更新時間:2020-12-24 17:37:25 來源:動力節點 瀏覽1771次

隊列是一種特殊的線性表,特殊之處在于它只允許在表的前端(front)進行刪除操作,而在表的后端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。隊列分為順序隊列和循環隊列兩種,4種隊列實現方式,分別為:順序隊列、循環隊列、鏈表隊列和數組隊列。

 

下面我們一一來看4種隊列實現方式:

1.順序隊列

using System;

public class QueueLine<T>: IQueue<T>

{

    private int count;

    private int front;

    private int rear;

    public T[] data;

    public int size;

 

 

    public QueueLine(int size)

    {

        data = new T[size];

        this.size = size;

        count = 0;

        front = -1;

        rear = -1;

    }

    //默認創建10個

    public QueueLine() : this(10)

    {

        

    }

    public int Count

    {

        get =>count;

    }

 

    public int Size

    {

        get => size;

    }

 

    public int GetLength()

    {

        return count;

    }

 

    public bool IsEmpty()

    {

        return count == 0;

    }

 

    public void Clear()

    {

        count = 0;

        front = rear = -1;

    }

 

    public bool IsFull()

    {

        return count == size;

    }

 

    public void EnQueue(T elem)

    {

        if (IsFull())

        {

            Console.WriteLine("隊列已滿");

            return;

        }

        data[++rear] = elem;

        count++;

    }

 

    public T DeQueue()

    {

        if (count > 0)

        {

            T temp = data[front + 1];

            front++;

            count--;

            return temp;

        }

        else

        {

            Console.WriteLine("隊列為空,無法取得隊首元素");

            return default(T);

        }

    }

 

    public T Peek()

    {

        if (IsEmpty())

        {

            Console.WriteLine("隊列為空,無法取得隊首元素");

            return default(T);

        }

        return data[front + 1];

    }

}

2.循環隊列

using System;

 

public class QueueLoop<T> : IQueue<T>

{

    private int maxSize; //循環隊列的容量

    private T[] data; //數組,存儲數據元素

    private int front; //指示最近一個已經離開隊列的元素所占有的位置  循環順序隊列的對頭

    private int rear; //指示最近一個進入隊列的元素的位置  循環順序隊列的隊尾

 

    public T this[int index]

    {

        get { return data[index]; }

        set { data[index] = value; }

    }

 

    public int MaxSize

    {

        get => maxSize;

        set => maxSize = value;

    }

 

    public int Front

    {

        get => front;

        set => front = value;

    }

 

    public int Rear

    {

        get => rear;

        set => rear = value;

    }

 

    public QueueLoop()

    {

    }

 

    public QueueLoop(int size)

    {

        data = new T[size];

        maxSize = size;

        front = rear = -1;

    }

 

    public void EnQueue(T elem)

    {

        if (IsFull())

        {

            Console.WriteLine("Queue is Full!");

            return;

        }

 

        rear = (rear + 1) % maxSize;

        data[rear] = elem;

    }

 

    public T DeQueue()

    {

        if (IsEmpty())

        {

            Console.WriteLine("Queue is Empty!");

            return default(T);

        }

 

        front = (front + 1) % maxSize;

        return data[front];

    }

 

    public T Peek()

    {

        if (IsEmpty())

        {

            Console.WriteLine("Queue is Empty!");

            return default(T);

        }

 

        return data[(front + 1) % maxSize];

    }

 

    public int GetLength()

    {

        return (rear - front + maxSize) % maxSize;

    }

 

    public bool IsEmpty()

    {

        return front == rear;

    }

 

    public void Clear()

    {

        front = rear = -1;

    }

 

    //判斷循環隊列是否已滿

    public bool IsFull()

    {

        return (front == -1 && rear == maxSize - 1) || (rear + 1) % maxSize == front;

    }

}

3.鏈表隊列

using System;

 

public class QueueLink<T> : IQueue<T>

{

    private QueueNode<T> front;

    private QueueNode<T> rear;

    private int size;

 

    public QueueNode<T> Front

    {

        get => front;

        set => front = value;

    }

 

    public QueueNode<T> Rear

    {

        get => rear;

        set => rear = value;

    }

 

    public int Size

    {

        get => size;

        set => size = value;

    }

 

    public QueueLink()

    {

        front = rear = null;

        size = 0;

    }

 

    public void EnQueue(T elem)

    {

        QueueNode<T> q = new QueueNode<T>(elem);

        if (IsEmpty())

        {

            front = q;

            rear = q;

        }

        else

        {

            rear.Next = q;

            rear = q;

        }

 

        size++;

    }

 

    public T DeQueue()

    {

        if (IsEmpty())

        {

            Console.WriteLine("Queue is Empty!");

            return default(T);

        }

 

        QueueNode<T> p = front;

        front = front.Next;

        if (front == null)

        {

            rear = null;

        }

 

        --size;

        return p.Data;

    }

 

    public T Peek()

    {

        if (IsEmpty())

        {

            Console.WriteLine("Queue is Empty!");

            return default(T);

        }

 

        return front.Data;

    }

 

    public int GetLength()

    {

        return size;

    }

 

    public bool IsEmpty()

    {

        return front == rear && size == 0;

    }

 

    public void Clear()

    {

        front = rear = null;

    }

 

    //由于鏈表不存在滿的情況

    public bool IsFull()

    {

        return false;

    }

}

 

public class QueueNode<T>

{

    private T data; //數據域

    private QueueNode<T> next; //指針域

 

    public QueueNode(T val, QueueNode<T> p)

    {

        data = val;

        next = p;

    }

 

    public QueueNode(QueueNode<T> p)

    {

        next = p;

    }

 

    public QueueNode(T val)

    {

        data = val;

    }

 

    public QueueNode()

    {

        data = default(T);

        next = null;

    }

 

    public T Data

    {

        get => data;

        set => data = value;

    }

 

    public QueueNode<T> Next

    {

        get => next;

        set => next = value;

    }

}

 

4.數組隊列

用 head、tail、count 分別代表隊首、隊尾、隊列中的元素個數,在 QueueStudy 實例對象構造時將數組大小初始化。class QueueStudy

{

    private int[] queue ; // 數組隊列

    private int head; // 隊首

    private int tail; // 隊尾

    private int count; // 隊列元素

 

    public QueueStudy(int len)

    {

        queue = new int[len];

        head = 0;

        tail = 0;

        count = 0;

    }

 

    public void push(int element)

    {

        if(tail== queue.length)

            System.out.println("隊列已滿,無法入隊");

        else{

            queue[tail++] = element;

            count++;

        }

    }

 

    public int pop()

    {

        if(tail== 0)

            return -1 ; // 這里用 -1 代表無元素可出隊

        int num = queue[head++];

        count--;

        return num;

    }

 

    public int peek()

    {

        if(count == 0)

            return -1 ; // 這里用 -1 代表隊首無元素

        return queue[head];

    }

 

    public Boolean isEmpty()

    {

        return count==0;

    }

 

    public int size()

    {

        return count;

    }

}

 

因為隊列只允許在一端插入,在另一端刪除,所以只有最早進入隊列的元素才能最先從隊列中刪除,故隊列又稱為先進先出(FIFO—first in first out)線性表。因此,在某種程度上,隊列也有著線性表的基本性質,想要了解更多的隊列相關的知識,可以觀看本站的數據結構和算法教程,快速掌握各種數據結構的知識。


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 亚洲天堂久久 | 成 人 a v免费视频 | 日本热久久 | 性生活免费网站 | 亚洲色婷婷综合开心网 | 色18美女社区 | 免费爱爱片 | 天天射天天射天天干 | 欧美日韩亚洲无线码在线观看 | 波多野结衣xxxx性精品 | 色爱区综合五月激情 | 黄色大全网站 | 亚洲欧洲日本在线 | 成人爱爱爱欧美日本视频 | 久久尹人香蕉国产免费天天 | 99热久久这里只有精品在 | 中文字幕天天躁夜夜狠狠综合 | 欧美精品一区在线看 | 女生毛片 | 99色播| 欧美黄视频在线观看 | 中文字幕在亚洲第一在线 | 呦女亚洲一区精品 | 亚洲欧美精品网站在线观看 | 免费国产之a视频 | 亚洲久久久 | 亚洲一区二区三区在线免费观看 | 日韩欧美aa级草草免费视频 | 99爱在线精品视频网站 | 四虎e456tcom | 日韩一区三区 | 日本乱中文字幕系列在线观看 | 国产欧美一区二区另类精品 | 一本久道久久综合中文字幕 | 午夜社区 | 午夜激情男女 | 国产一区二区三区四 | 99久久精彩视频 | 亚洲已满18点击进入在线观看 | 国产福利精品在线 | 中文字幕在线观看一区二区三区 |