队列也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。
每个元素必然按照进入的次序离队,所以又把队列称为先进先出表(First In First Out,简称FIFO)
链式队列存储结构也是通过由结点构成的单链表实现的。
#include<iostream>
using namespace std;
//结点类型定义
class Node{
public:
int data;
Node *next;
};
//定义链队类型,由队头指针front和队尾指针rear组成
//为了运算方便,可在队头节点前增加一个头节点,并将front指向头结点,这样若链队为空,则头指针和尾指针均指向头结点(front==rear)
class Queue{
public:
Node *front,*rear;
};
/*
链队的插入和删除操作同样不需要比较和移动元素,只需修改相关指针和进行结点动态分配和回收操作,时间复杂度O(1)
使用链队不存在队满问题,因为它使用的结点是动态分配的,只要内存中动态存储区仍有可用空间,就可以得到新结点插入链队
*/
// 1.初始化链队列
void init_queue(Queue *lq){
//初始化链队,即把队头和队尾指针置空
lq->front = new Node;
lq->front->next = NULL;
lq->rear = lq->front;
}
// 2.判断链队是否为空
bool is_empty(Queue *lq){
//若链队为空,返回1,否则返回0
if(lq->front == lq->rear)
return 1;
else
return 0;
}
// 3.取队头元素
int front(Queue *lq){
if(is_empty(lq)) { //若链队为空,则终止执行,并返回0
cout<<"Linked queue is empty!\n";
return 0;
}
else
return (lq->front->next->data);
}
// 4.链队的入队
void insert(Queue *lq, int x){ //把新元素x插入链队的尾端
Node *p;
p = new Node; //步骤1:申请一个由P指针指向的新结点
p->data = x; //步骤2:把x的值赋给新结点的值域
p->next = NULL; //步骤3:把新节点的指针域置空
lq->rear->next = p; //步骤4:修改队尾节点的指针
lq->rear = p; //步骤5:修改队尾指针使之指向新的队尾结点
}
// 5.链队的出队
//从链队中删除队头元素
bool pop(Queue *lq){
if(is_empty(lq)){ //如果链队为空,则终止执行,并返回0
cout<<"Linked queue is empty!\n";
return 0; //出队不成功,返回0
}
else{
Node *p;
p = lq->front->next; //暂存队头指针,以便回收队头结点
if(p == lq->rear){ //如果只有一个结点,出列后链队为空
lq->front = lq->rear;
}
else{
lq->front->next = p->next; //修改指针
delete (p); //回收空间
return 1; //出队成功,返回1
}
}
}
int main()
{
return 0;
}
—— 生命的意义,在于赋予它意义。