队列:先进先出FIFO线性表
队列的定义
允许在表的一端进行插入,而在表的另一端进行删除。
队头----允许删除的一端。
队尾----允许插入的一端。
存取原则:先进先出FIFO
- 置空队SetNull(Q)
将队列Q置成空队列。 - 入队Push (Q, x)
将元素x插入到队列Q的队尾。 - 出队PoP(Q)
删除队列Q的队头元素。 - 取队头元素GetTop (Q)
返回队列Q的队头元素,队头元素并不出队。 - 判队空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;
}
}