顺序队列
顺序队列:用一片连续的存储空间来存储队列中的数据元素,这样的队列称作顺序队列(SequenceQueue)。类似顺序栈,用一维数组来存放顺序队列中的数据元素。队头位置设置在数组下标为0的段,用 front 表示;队尾位置设在数组的另外一端,用 rear 表示。front 和 rear 随着插入和删除而变化。当队列为空时,front = rear = -1;
队列的功能接口
public Interface IQueue<T>
{
void Enqueue(T item);入队(放在队尾Rear)
T Dequeue(); 出队(放在队首 Front)
T Peek();得到队首的元素,不移除
void Clear();清空元素
int Count{get;}求队列的长度,元素的个数
int GetLength()
bool IsEmpty();判断队列是否为空
}
实现顺序队列
只要顺序两个字,一定是使用数组存储的,在
入队
时要考虑元素的个数
是否
已经填满数组
和队尾的位置
,
出队
的时候要考虑数组元素的个数和队首的位置,顺序队列的队首或队尾位于数组末尾(length-1)时要移到数组首位即[0]号位置。取得的元素都是 data[front+1]除了在数组尾部直接等于 data[0],入栈存储数据 data[rear+1],在数组尾部直接等于 data[0]。
public SeqQueue<T>:IQueue<T>
{
private T[ ]data;存储数据
private int count;当前有多少元素
private int front;队首索引
private int rear;队尾
构造函数
public SeqQueue(int size)
{
data = new T[size];
count = 0;
front = rear =-1;
}
public SeqQueue():this(8){}
获取当前元素的个数
public int Count
{
get{return count;}
}
pulic int GetLength()
{
return count;
}
判断是否为空
public bool IsEmpty()
{
return count==0;
}
清空操作,只要把 count 和队首队尾重置就可以了
public void Clear()
{count=0;
front = rear=-1;
}
入队操作
public void Enqueue(T item)
{
if(count==data.Length)判断数组有没有多余的空间
{
cw("队列已满,不可以再添加新的数据");
} else
{
如果有空间存储,判断是否位于数组的末尾
if(rear==data.Length-1)
{队尾位于数组末尾,新来的元素需要在数组0号位置存储
data[0]=item;
rear=0;
}else
{
data[rear+1]=item;
rear++;
}
count++;
}
}
出队操作
public T Dequeque()
{
if (count <= 0) {
Console.WriteLine ("队列为空,不可以删除数据");
return default(T);
} else {
当队首位于数组的末尾,队首移动到数组0号位置首位
if (front == data.Length-1) {
front = 0;
count--;
return data [0];
} else {
T temp = data [++front];
count--;
return temp;
}
}
}
取数据
public T Peek()
{
if (count <= 0) {
Console.WriteLine ("队列为空");
return default(T);
} else {
if (front == data.Length-1) {
return data [0];
} else {
return data [front+1];
}
}
}