原创作者:Daniel
时间:2017.10.29
地点:大连理工大学软件学院
FIFO(first in first out)
队列不改变进入队列元素的顺序,即队列可以存储元素的顺序。
队列存储结构:
1、顺序队列:分配一段连续的区域存储队列的元素,需要预先制定队列大小。
为了充分使用队列空间,一般会将队列在逻辑上看成一个圆,队满条件为 (rear + 1)% M == front,队空条件为 rear = front,队列中元素个数为(rear - front + M)% M;
实现顺序队列的C++代码:
template <typename T>
class queue{
private:
int size;
T* qqueue;
int front;
int rear;
public:
queue(int size){
this->size = size;
qqueue = new T [size];
front = rear = 0;
}
~queue(){
if(qqueue)
delete [] qqueue;
}
bool enqueue(T & a){
if((rear + 1) % size == front){
return false;
}
qqueue[rear] = a;
rear = (rear + 1) % this->size;
return true;
}
bool dequeue(){
if(rear == front ){
return false;
}
front = (front + 1 )% this->size;
return false;
}
T first(){
if(rear == front){
return -1;
}
return qqueue[front];
}
int get_size(){
return ((rear - front + this->size));
}
};
2、链式存储
设置一个队头指针front,队尾指针rear,通过front进行删除,通过rear进行元素入队。
不过要注意的是队列为空时的进队情况,以及对列为空时的出队情况。
实现链式队列的C++代码:
template <typename T>
class queue{
private:
int cursize;
Node<T>* front;
Node<T>* rear;
public:
queue(){
front = rear = NULL;
cursize = 0;
}
~queue(){
Node<T>* temp;
while(front){
temp = front->next;
delete front;
front = temp;
}
}
bool enqueue(T & a){
Node<T>* p(a, NULL);
if(rear == NULL){
front = p;
rear = p;
cursize++;
}
p->next = rear;
rear = p;
cursize ++;
return true;
}
bool dequeue(){
if(front == NULL){
rear = NULL;
return false;
}
Node<T>* p = front ->next;
delete front;
cursize --;
front = p;
return true;
}
T first(){
if(front == NULL){
return -1;
}
return front->item;
}
};