重新整理数据结构与算法——数组模拟队列和环形队列[三]
前言
在开发之中我们基本上不会自己再去写队列了,而是去使用现在成熟的队列框架。
但是我们也应该知道如何去自己实现。
整理基本的数据结构,大概81篇,为c# 文。
正文
队列的一些特性:
1.队列是一个有序列表,可以用数组和链表来实现。
2.遵守先入先出原则。
那么一个队列需要什么?
下面几个参数是需要的:
1.一个数组
2.队尾标志
3.队首标志
4.数组大小
函数:
1.判断是否为空
2.判断是否满了
3.向队列里添加元素
4.向队列弹出元素
5.展示队首元素
code 实现
public class ArrayQueue
{
private int[] arr;
private int MaxLen;
private int front=-1;
private int rear=-1;
public ArrayQueue(int len)
{
this.MaxLen = len;
this.arr = new int[len];
}
//是否队列满了
public bool isFull()
{
return rear == MaxLen - 1;
}
//是否队列为空
public bool isEmply()
{
return rear == front;
}
//添加队列元素
public bool addEle(int ele)
{
if (isFull())
{
return false;
}
rear++;
arr[rear] = ele;
return true;
}
//显示队列中全部数据
public void showQueue()
{
for (int i=front+1;i<=rear;i++)
{
Console.WriteLine(arr[i]);
}
}
//将队首弹出
public int pop() {
if (isEmply())
{
throw new Exception();
}
return arr[++front];
}
//显示队首
public int headQueue() {
if (isEmply())
{
throw new Exception();
}
return arr[front+1];
}
}
出现的问题,或者说不足之处:
这个队列是一次性的,因为front 最终会到达rear,这样就一直显示队列满了。
那么这个时候就需要环形数组。
环形数组
环形数组设置front 和rear 全部为0。
看下什么时候队列是满的:
什么时候队列是空的:
有了这两个就很好改了。
环形数组代码
public class CircleQueue
{
private int[] arr;
private int MaxLen;
private int front;
private int rear;
public CircleQueue(int len)
{
this.MaxLen = len;
this.arr = new int[len];
}
//是否队列满了
public bool isFull()
{
return rear+1%MaxLen== front;
}
//是否队列为空
public bool isEmply()
{
return rear == front;
}
//添加队列元素
public bool addEle(int ele)
{
if (isFull())
{
return false;
}
arr[rear] = ele;
rear = rear + 1 % MaxLen;
return true;
}
//显示队列中全部数据
public void showQueue()
{
for (int i = front + 1; i <= rear; i++)
{
Console.WriteLine(arr[i]);
}
}
//将队首弹出
public int pop()
{
if (isEmply())
{
throw new Exception();
}
var result=arr[front];
front = front + 1 % front;
return result;
}
//显示队首
public int headQueue()
{
if (isEmply())
{
throw new Exception();
}
return arr[front];
}
}