队列完完全全就是生活中的队列(当然不包含插队的情况),饭堂打饭需要排队,去银行办理业务也需要排队,显然的,排在第一的那个人儿肯定最先得到服务,完成待办的事情。最后的那个人得看银行下班了没!
这些都是实实在在的队列,数据结构中的队列所实现的功能也正是如此,把元素加到队列叫入队(enqueue),把元素从队列中移除叫出队(dequeue),只能从队头中获取元素(front),额,队列的主要操作就三个了,看看图就知道队列的实现很简单。
队列也可以分为两种实现方式,一是顺序队列,用原生数组来实现,二是链式队列,使用指针操作来实现。
先来实现一个顺序队列,很简单的,使用两个标记变量,当有元素入队则队尾标记自增1,相类似地,执行出队列操作则队头标记自增1。但要稍微注意的情况是,需要对队头和队尾标记变量进行取余操作,那为什么要取余呢??为了可以同时进行入队和出队的操作,看图就马上明白!!假设一个满的(满的!!!)队列,进行了很多次出队列操作,那么队尾标记仍然是在数组的末尾,但是队头标记已经自增了很多次,即将来到队尾,如果这时候进行入队操作,那队尾是不是只能回到数组的首元素,确实是的。
明白了那就上代码:
#ifndef STATICQUEUE_H
#define STATICQUEUE_H
template <typename T, int N>
class StaticQueue
{
protected:
T array[N];
int m_front;
int m_rear;
int m_length;
public:
StaticQueue()
{
m_front = 0;
m_rear = 0;
m_length = 0;
}
bool enqueue(const T& obj) // 几行代码就完成入队操作
{
bool ret = true;
if( m_length < N )
{
array[m_rear] = obj;
m_rear = (m_rear + 1) % N; // 使得队列可持续操作
++m_length;
}
else
{