数据结构之队列

定义:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表

今天我们将将顺序队列和循环队列(附代码实现)

 

顺序队列

首先我们要有一块连续的存储空间去存储我们队列的元素,这里我们使用数组。当然还需要两个指针,一个(front)指向队头,一个(rear)指向队尾元素。

所谓顺序队列就是在队尾加入一个元素rear+1,从队头删除一个元素front+1。当rear增加到指向分配的连续空间之外时,队列无法再插入新元素,但这时往往还有大量可用空间未被占用,这些空间是已经出队的队列元素曾经占用过得存储单元,这是顺序队列的一个最大的缺点,浪费内存

循环队列

解决顺序队列的缺点的办法就是,当rear增加到指向分配的连续空间之外时,将rear指向数组的第一个位置。

这实际上是把队列空间想象成一个环形空间,环形空间中的存储单元循环使用,用这种方法管理的队列也就称为循环队列。除了一些简单应用之外,真正实用的队列是循环队列。

下面是循环队列的C#代码实现:

 /// <summary>
    /// 循环队列
    /// </summary>
    public class Queue
    {
        //private int[] arr;  //队列容器
        //private int maxSize;  //容器初始化长度
        //private int front;  //队头元素下标
        //private int rear;  //队尾元素下标
        //private int length;  //队列长度

        public int[] Arr { get; set; }
        public int MaxSize { get; set; }
        public int Front { get; set; }
        public int Rear { get; set; }
        public int Length { get; set; }
        public Queue(int maxSize) 
        {
            this.Arr = new int[maxSize];
            this.MaxSize = maxSize;
            this.Front = 0;
            this.Rear = -1;
            this.Length = 0;
        }

        /// <summary>
        /// 向队列中插入一个元素
        /// </summary>
        /// <param name="elem">加入的元素的值</param>
        public void insert(int elem) 
        {
            if (isFull()) 
            {
                Console.WriteLine("队列已满,不能再插入元素");
                return;
            }
            if (Rear == MaxSize-1) 
            {
                Rear = -1;
            }
            Arr[++Rear] = elem;
            Length++;
        }

        /// <summary>
        /// 从对垒中移除对头元素
        /// </summary>
        /// <returns>返回移除的元素</returns>
        public int? remove() 
        {
            if (isEmpty()) 
            {
                Console.WriteLine("队列为空,没有可以删除的元素");
                return null;
            }
            int elem = Arr[Front++];
            if (Front == MaxSize) 
            {
                Front = 0;
            }
            Length--;
            return elem;
        }

        /// <summary>
        /// 查看队头元素
        /// </summary>
        /// <returns></returns>
        public int? peek() 
        {
            if (isEmpty())
            {
                Console.WriteLine("队列为空,没有元素");
                return null;
            }
            return Arr[Front];
        }

        /// <summary>
        /// 判断队列是否为空
        /// </summary>
        /// <returns></returns>
        public bool isEmpty() 
        {
            return (Length == 0);
        }

        /// <summary>
        /// 判断队列是否已满
        /// </summary>
        /// <returns></returns>
        public bool isFull() 
        {
            if (Length == MaxSize) 
            {
                return true;
            }
            return false;
        }
    }

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值