特殊的线性表——队列

队列:先进先出FIFO线性表

队列的定义

允许在表的一端进行插入,而在表的另一端进行删除。
队头----允许删除的一端。
队尾----允许插入的一端。
存取原则:先进先出FIFO
在这里插入图片描述

  1. 置空队SetNull(Q)
    将队列Q置成空队列。
  2. 入队Push (Q, x)
    将元素x插入到队列Q的队尾。
  3. 出队PoP(Q)
    删除队列Q的队头元素。
  4. 取队头元素GetTop (Q)
    返回队列Q的队头元素,队头元素并不出队。
  5. 判队空Empty(Q)
    判别队列Q是否为空。

循环队列

在这里插入图片描述

实现

const int QueueSize = 1000;
template <class T>
class CircleQueue //循环队列模板类
{
public:
 CircleQueue() { front = rear = 0; }//构造函数
 void EnQueue(T x); //入队
 T DeQueue(); //出队
 T GetFront(); //查找队头元素
 int GetLength();   //求队列长度
 bool Empty() { return front == rear ? true : false; }//判队空
private:
 T data[QueueSize];
 int front; //队头指针
 int rear; //队尾指针
};

入队操作

当有元素入队后,队尾指针移向“下”一个位置
r = (r+1) %Queuesize;
在这里插入图片描述

template <class T>
void CircleQueue<T>::EnQueue(T x) //入队
{
 //队满溢出,抛出异常
 if ((rear + 1) % QueueSize == front) throw "overflow";
 //队尾指针移向“下”一个位置
 rear = (rear + 1) % QueueSize;
 data[rear] = x;
}

出队操作

当有元素出队后,队头指针移向“下”一个位置
f =(f+1)% Queuesize ;
在这里插入图片描述

template <class T>
T CircleQueue<T>::DeQueue() //出队
{
 //队空,抛出异常
 if (rear == front) throw "underflow";
 //队头指针移向“下”一个位置
 front = (front + 1) % QueueSize;
 return data[front];
}

查找对头元

template <class T>
T CircleQueue<T>::GetFront()//查找队头元素
{
 if (rear == front) throw "underflow";
 return data[(front + 1) % QueueSize];
}

求队列长度

template <class T>
int CircleQueue <T>::GetLength()
{
 return (rear - front + QueueSize) % QueueSize;
}

链队

队头:头结点,用来出队删除
队尾:尾指针,用来入队插入
在这里插入图片描述

实现

template <class T>
class LinkQueue { //链队列模板类
public:
 LinkQueue() {  //构造函数
  front = rear = new Node <T>;
  front->next = NULL;
 }
 ~LinkQueue(); //析构函数
 void EnQueue(T x);//入队
 T DeQueue(); //出队
 T GetFront(); //查找队头元素
 bool Empty() { return front == rear ? true : false; }//判队空
private:
 Node <T> * front, *rear;//队头、队尾指针
};

入队操作

在这里插入图片描述

template <class T>
void LinkQueue<T>::EnQueue(T x)//入队
{
 rear->next = new Node <T>;//建立新结点①
 rear = rear->next;//移动队尾指针②
 rear->data = x;  //③
 rear->next = NULL;  //④
}

出队操作

在这里插入图片描述
在这里插入图片描述

template <class T>
T LinkQueue<T>::DeQueue() //出队
{
 Node <T> * p = front->next; //保存队头元素指针①
 if (!p) throw “Underflow”;//若队空,抛出异常
 front->next = p->next; //原队头元素出链②
 T x = p->data; //保存队头数据③
 delete p; //释放原队头元素④
 if ((front->next) == NULL) //若队列变为空队,修改队尾指针
  rear = front;
 return x;
}

析构函数

template <class T>
LinkQueue<T>:: ~LinkQueue()
{
 while (front != NULL)
 {
  rear = front->next;
  delete front;
  front = rear;
 }
}
发布了14 篇原创文章 · 获赞 15 · 访问量 1133

猜你喜欢

转载自blog.csdn.net/FirstOfSky/article/details/105293991