03 一次性队列

1.队列介绍

  • 队列是一个有序列表,可以用数组或是链表来实现。

  • 遵循陷入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出。

队列有两种实现方式,一种是数组一种是链表。(这里用数组模拟队列)

a5e9e07c00b5476beb16d7f372b194a9.png

图中,左一

  • 首先初始化一个数组和两个指针front、rear;

  • front代表队首,rear代表队尾默认输出化时都为-1;

图中,中间

  • 当我们有数据插入值rear指针为2,front指针-1;因为插入数据在队尾添加,取出数据从队首开始取。

图中,右一

  • 当我们取出数据时,front指针为1

2.数组模拟队列

队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图,其中MaxSize是队列的最大容量。

因为队列的输入、输入是分别从后端来处理,因此需要两个变量front及rear分别记录队列前后端的下标,front会随着数据输出而改变,而rear则是随着数据输入而改变。

如图:

651e183200991ec55e256302ec246765.png

当我们将数据存入队列时称为“Add Queue”,Add Queue的处理需要有两个步骤:

  • (1)将尾指针往后移,rear+1,当front==rear时队列为空

  • (2)若尾指针rear小于队列的最大小标MaxSize-1,则将数据存入rear所指的数组元素中,否则无法存入数据。rear==MaxSize-1时则队列满。

3.代码实现

public class MyQueue1
    {
        //队列最大值
        private int _maxSize;
        //队列头部
        private int _front;
        //队列尾部
        private int _rear;
        //存储值的数组
        private int[] _tempArray;

        public MyQueue1(int maxSize) 
        {
            _maxSize = maxSize;
            _tempArray = new int[_maxSize];
            _front = -1;//指向队列头的前一个位置
            _rear = -1;//指向队列尾,指向队列最后一个数据
        }

        public bool IsFull() 
        {
            return _rear == _maxSize - 1;
        }

        public bool IsEmpty()
        {
            return _rear == _front;
        }

        public void EnQueue(int val)
        {
            if (IsFull()) 
            {
                Console.WriteLine("队列已满,无法加入数据!");
                return;
            }
            _rear++;
            _tempArray[_rear] = val;
        }

        public int DeQueue()
        {
            if (IsEmpty())
            {
                throw new Exception("队列是空的,无法取出数据!");
            }
            _front++;
            return _tempArray[_front];
        }

        public void ShowAll() 
        {
            if (IsEmpty()) {
                Console.WriteLine("队列是空的!");
                return;
            }
            Console.WriteLine("显示队列所有内容:");
            foreach (var item in _tempArray)
            {
                Console.Write($"{ item }\t");
            }
            Console.WriteLine();
        }

        public void PeekFirst() 
        {
            if (IsEmpty()) {
                Console.WriteLine("队列是空的,无法取出数据!");
                return;
            }

            Console.WriteLine($"查看第一个值:{ _tempArray[_front + 1] }");
        }
    }

调用

MyQueue1 queue = new MyQueue1(3);
            queue.EnQueue(97);
            queue.EnQueue(98);
            queue.EnQueue(200);
            //查看第一个值
            queue.PeekFirst();
            //显示队列里所有的内容
            queue.ShowAll();
            //取出一个值
            Console.WriteLine($"取出一个值:{ queue.DeQueue() }");
            Console.WriteLine($"取出一个值:{ queue.DeQueue() }");
            Console.WriteLine($"取出一个值:{ queue.DeQueue() }");
            queue.PeekFirst();
            queue.EnQueue(200);

4793e2f3b396ecc31cc994b5c9a57f3d.png

看到这里,其实在想操作这个队列已经是不可能的了。因为front和rear两个指针没有重置。下一章将会提到环形队列。

4.总结

  • 队列是一个有序列表,可以用数组或是链表来实现。

  • 遵循陷入先出的原则。即:先存入队列的数据,先取。后存入的要后取出

技术群: 需要进技术群学习交流的请添加小编微信,切记备注:加群,对以上内容有什么疑问也可以直接和小编直接沟通交流!     

小编微信:mm1552923   

公众号:dotNet编程大全   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值