循环队列损失空间
是因为队列空时使用了font==rear
的,队列满时则不能再使用,只能使得空出一位做判断用(rear+1)%array.length=font
解决这一问题可以设置一个标志位tag,tag=0表示空,tag=1表示满。
当入队后rear=font时,tag置为1;
当出队后font=rear时,tag置为0;
实现
Queue
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FullQueue
{
class Queue<T>
{
T[] queue; //队列数组
int font; //队首
int rear; //队尾
int tag; //标志位,指示队满和队空状态,0空 1满
public int Tag { get => tag; set => tag = value; }
/// <summary>
/// 构造器
/// </summary>
public Queue(int length)
{
queue = new T[length];
font = 0;
rear = tag = font;
}
/// <summary>
/// 入队
/// </summary>
/// <param name="data"></param>
public void Put(T data)
{
if (tag == 1) return;
queue[rear] = data;
rear = (rear + 1) % queue.Length;
//队满状态
if (rear == font) tag = 1;
}
/// <summary>
/// 出队
/// </summary>
/// <returns></returns>
public T Get()
{
if (tag == 0) return default(T);
T tmp = queue[font];
font = (font + 1) % queue.Length;
//队空状态
if (font == rear) tag = 0;
return tmp;
}
}
}
Program
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FullQueue
{
class Program
{
static void Main(string[] args)
{
Queue<string> queue = new Queue<string>(5);
queue.Put("a");
queue.Put("b");
queue.Put("c");
queue.Put("d");
queue.Put("e");
queue.Put("f");
while (queue.Tag != 0)
{
Console.WriteLine(queue.Get());
}
}
}
}