重新整理数据结构与算法——数组模拟队列和环形队列[三]

前言

在开发之中我们基本上不会自己再去写队列了,而是去使用现在成熟的队列框架。

但是我们也应该知道如何去自己实现。

整理基本的数据结构,大概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];
	}
}
posted @ 2020-06-09 17:32  敖毛毛  阅读(236)  评论(1编辑  收藏  举报