美文网首页DotNET Core
【数据结构】【C#】008-队列:👬👬顺序队列(循环队列)

【数据结构】【C#】008-队列:👬👬顺序队列(循环队列)

作者: lijianfex | 来源:发表于2018-10-12 15:18 被阅读0次

C#数据结构:顺序队列

1、 顺序队列的假溢出现象

队列的一种顺序存储称为顺序队列。与顺序栈类似,在队列的顺序存储结构中,用一组地址连续的存储单元依次存放从队头到队尾的元素,如一维数组 Queue[MAXSIZE]。
由于队列中队头和队尾的位置都是动态变化的,因此需要附设两个指针 front 和 rear。
front:指示队头元素在数组中的位置;
rear:指示真实队尾元素相邻的下一个位置。
初始化队列时,令 front = rear =0;
入队时,直接将新元素送入尾指针 rear 所指的单元,然后尾指针增 1;出队时,直接取出队头指针 front 所指的元素,然后头指针增 1。显然,在非空顺序队列中,队头指针始终指向当前的队头元素,而队尾指针始终指向真正队尾元素后面的单元。当 rear==MAXSIZE 时,认为队满。但此时不一定是真的队满,因为随着部分元素的出队,数组前面会出现一些空单元,如下图(d)所示。由于只能在队尾入队,使得上述空单元无法使用。把这种现象称为假溢出,真正队满的条件是 rear - front=MAXSIZE 。


img.jpg

2、 循环队列

为了解决假溢出现象并使得队列空间得到充分利用,一个较巧妙的办法是将顺序队列的数组看成一个环状的空间,即规定最后一个单元的后继为第一个单元,我们形象地称之为循环队列。
假设队列数组为 Queue[MAXSIZE],当 rear+1=MAXSIZE 时,令rear=0,即可求得最后一个单元 Queue[MAXSIZE-1]的后继:Queue[0]。更简便的办法是通过数学中的取模(求余)运算来实现:
ear=(rear+1)mod MAXSIZE,显然,当 rear+1=MAXSIZE 时,rear=0,
同样可求得最后一个单元 Queue[MAXSIZE-1]的后继:Queue[0]。所以,借助于取模(求余)运算,可以自动实现队尾指针、队头指针的循环变化。
进队操作时,队尾指针的变化是:rear=(rear+1)mod MAXSIZE ;
而出队操作时,队头指针的变化是:front=(front+1)mod MAXSIZE。


3、顺序队列的实现:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 顺序队列
/// </summary>
/// <typeparam name="T"></typeparam>
public class SeqQueue<T>
{
    private T[] data;
    private int front;//队首
    private int rear;//队尾
    private int count;//队中个数


    //初始化
    public SeqQueue(int size)//size:最大容量
    {
        data = new T[size];
        front = 0;
        rear = 0;
        count = 0;
    }

    public SeqQueue() : this(10)
    {

    }

    //最大容量
    public int MaxSize
    {
        get
        {
            return data.Length;
        }
    }

    //队中元素个数
    public int Count
    {
        get
        {
            return count;
        }

        set
        {
            count = value;
        }
    }

    //判空
    public bool IsEmpty()
    {
        return Count == 0;
    }

    //判满
    public bool IsFull()
    {
        return Count == MaxSize;
    }

    //入队
    public void Enqueue(T item)
    {
        if (IsFull())
        {
            throw new System.Exception("队满,无法入队!");
        }
        data[rear] = item;
        Count++;
        rear = (rear + 1) % MaxSize;//修改队尾指针
    }

    //出队
    public T Dequeue()
    {
        if (IsEmpty())
        {
            throw new System.Exception("队空,无法出队!");
        }

        T t = data[front];
        front = (front + 1) % MaxSize; //修改队首指针
        Count--;
        return t;

    }

    //访问队首元素
    public T Peek()
    {
        if (IsEmpty())
        {
            throw new System.Exception("队空,无法访问队首!");
        }
        return data[front];
    }

    //清空队列
    public void Clear()
    {
        front = 0;
        rear = 0;
        Count = 0;
    }

}

顺序队列:测试用例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class _008_SeqQueue : MonoBehaviour
{
    SeqQueue<string> seqQueue;

    void Start()
    {
        //初始化队列
        seqQueue = new SeqQueue<string>(4);//size=4

        //队列最大容量       
        Debug.Log("队列最大容量:" + seqQueue.MaxSize);

        //判空
        Debug.Log("队列是否空:" + seqQueue.IsEmpty());

        //判满
        Debug.Log("队列是否满:" + seqQueue.IsFull());

        //入队列
        Debug.Log("入队列:" + "1,2,3,4");
        seqQueue.Enqueue("1");
        seqQueue.Enqueue("2");
        seqQueue.Enqueue("3");
        seqQueue.Enqueue("4");

        //队列中元素个数
        Debug.Log("队列中元素个数:    " + seqQueue.Count);

        //判满
        Debug.Log("队列是否满:" + seqQueue.IsFull());

        //出队列
        Debug.Log("出队列-----出队列值为:" + seqQueue.Dequeue());
       
        //队列中元素个数
        Debug.Log("出队列后,队列中元素个数:    " + seqQueue.Count);

        //访问队首元素
        Debug.Log("队首元素值:    " + seqQueue.Peek());

        //队列中元素个数
        Debug.Log("访问队首后,队列中元素个数:    " + seqQueue.Count);

        //清空队列
        seqQueue.Clear();
        Debug.Log("清空队列!");

        //队列中元素个数
        Debug.Log("清空队列后,队列中元素个数:    " + seqQueue.Count);


    }
}

输出结果:


img.jpg

注:

1、 队列的定义与特点
队列 (Queue) 是另一种限定性的线性表,它只允许在表的一端插入元素,而在另
一端删除元素。队列具有先进先出 (Fist In Fist Out,缩写为 FIFO)的特性。

2、 队列的基本操作
进队(插入)、出队(删除)。

3、 队列的存储:链队列、循环队列

4、 循环队列:将顺序队列数组视为首尾相接的队列,模运算支持克服假溢出。
区分循环队列队空队满的两种方法:

  • 损失一个元素空间;
  • 增设标志量 count。

相关文章

  • 【数据结构】【C#】008-队列:👬👬顺序队列(循环队列)

    C#数据结构:顺序队列 1、 顺序队列的假溢出现象 队列的一种顺序存储称为顺序队列。与顺序栈类似,在队列的顺序存储...

  • 队列

    顺序存储结构队列 循环队列 链队列

  • 数据结构-队列(Queue)-FIFO

    数据结构-队列(Queue)-FIFO 队列的接口设计 双端队列-Deque 循环队列-CircleQueue 双...

  • Java数组实现循环队列

    Java数组实现循环队列 上一节(Java实现队列——顺序队列、链式队列)我们使用数组实现了顺序队列,但是在tai...

  • 队列

    文章结构 什么是队列 实现队列顺序队列链式队列循环队列 Java中的队列 1. 什么是队列 队列也是一种操作受限的...

  • 【数据结构】【C#】009-队列:👬👬链队列

    C#数据结构:链队列 1、自定义链队列结构: 链队列节点类 2、链队列类: 链队列测试用例: 输出结果: 注: 队...

  • 常见的数据结构

    常见的数据结构有: 数组 链表单链表、双向链表、循环链表、双向循环链表、静态链表 栈顺序栈、链式栈 队列普通队列、...

  • 数据结构之队列的链式存储结构

    之前写了队列的顺序存储结构,队列的定义及操作见 数据结构之队列的顺序存储结构 队列的链式存储结构与操作实现 队列接...

  • 顺序队列(循环队列)

    1.队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表2.队列是一种先进先出(First In Fis...

  • java循环队列实现相关方法

    循环队列相关背景### 什么是队列就不解释了头尾相接的顺序存储结构称为循环队列(circular queue)。 ...

网友评论

    本文标题:【数据结构】【C#】008-队列:👬👬顺序队列(循环队列)

    本文链接:https://www.haomeiwen.com/subject/qwkgaftx.html