c#一次性队列


1.队列介绍

  • 队列是一个有序列表,可以用数组或是链表来实现。
  • 遵循陷入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出。

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

 

 

图中,左一

  • 首先初始化一个数组和两个指针front、rear;
  • front代表队首,rear代表队尾默认输出化时都为-1;

图中,中间

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

图中,右一

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

2.数组模拟队列

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

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

如图:

 

 

当我们将数据存入队列时称为“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);

 

 

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

4.总结

  • 队列是一个有序列表,可以用数组或是链表来实现。
  • 遵循陷入先出的原则。即:先存入队列的数据,先取。后存入的要后取出