1.队列介绍
- 队列是一个有序列表,可以用数组或是链表来实现。
- 遵循陷入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出。
队列有两种实现方式,一种是数组一种是链表。(这里用数组模拟队列)
图中,左一
- 首先初始化一个数组和两个指针front、rear;
- front代表队首,rear代表队尾默认输出化时都为-1;
图中,中间
- 当我们有数据插入值rear指针为2,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.总结
- 队列是一个有序列表,可以用数组或是链表来实现。
- 遵循陷入先出的原则。即:先存入队列的数据,先取。后存入的要后取出
|
请发表评论