队列是一种特殊的线性表,数据元素之间是线性关系,其插入和删除操作分别在两边进行,一端只能插入,另一端只能删除。
队首(front):进行删除操作的一端;
队尾(rear):进行插入操作的一端;
入队:在队尾插入一个元素;
出队:在队首插入一个元素;
特性:元素的操作顺序符合“先进先出(FIFO)”或“后进后出(LILO)”。
我以链式队列为例子讲解队列的一般操作。
链式队列的存储方式同一般的链式表的存储结构完全相同;队列与栈不同的是,队列两端都有操作,为了方便,需要设置两个指示器(front和rear),而栈只在一端操作,只需要一个指示器。
接下来说一下链式队列C++类实现。
1.链式队列的类定义:
//队列节点类的定义
struct QueueNode{
public:
int data;//队列数据元素
QueueNode *link;//节点链指针,指向下一个元素
public:
QueueNode(int d,QueueNode *next=NULL):data(d),link(next){}
};
//队列类的定义
class LinkedQueue{
public:
QueueNode *Front,*Rear;//队头、队尾指针
public:
LinkedQueue():Rear(NULL),Front(NULL){}//构造函数
~LinkedQueue(){MakeEmpty();}//析构函数
bool EnQueue(int x);//入队
bool DeQueue();//出队
bool GetFront();//取队首元素
void MakeEmpty();//队列置空
bool IsEmpty() const{return (Front==NULL)?true:false;}//队列判空
int GetSize();//求队列长度
};
2.成员函数的实现:
(1)置空队列操作:同单链表释放
void LinkedQueue::MakeEmpty(){
//释放链表中所有节点
QueueNode *p;
while (Front!=NULL){
//逐个释放节点
p = Front;
Front = Front->link;//从链上摘下
delete p;//释放
}
};
(2)入队操作:分为队列为空和队列不空两种情况
//入队
bool LinkedQueue::EnQueue(int x){
if(Front==NULL){
//创建第一个节点
Front = Rear = new QueueNode(x);
if(Front==NULL) return false;//分配失败
}
else{
//队列不空,插入
Rear->link = new QueueNode(x);
if(Rear->link==NULL) return false;//分配失败
Rear = Rear->link;
}
return true;
};
(3)出队操作:队头出去一个,队头指针后移一个节点
//出队
bool LinkedQueue::DeQueue() {
if (IsEmpty() == true) return false;//判队空
QueueNode *p = Front;
int x = Front->data;
Front = Front->link;
cout<<"出队元素:"<
(4)取队首元素
//获取队首元素
bool LinkedQueue::GetFront() {
if (IsEmpty() == true) return false;
int x = Front->data;
cout<<"队首元素:"<
(5)求队列长度
//求队长度
int LinkedQueue::GetSize(){
QueueNode *p = Front;
int k=0;
while(p!=NULL){
k++;
p= p->link;
}
return k;
};
完整ADT代码:
#include
using namespace std;
//队列节点类的定义
struct QueueNode{
public:
int data;//队列数据元素
QueueNode *link;//节点链指针,指向下一个元素
public:
QueueNode(int d,QueueNode *next=NULL):data(d),link(next){}
};
//队列类的定义
class LinkedQueue{
public:
QueueNode *Front,*Rear;//队头、队尾指针
public:
LinkedQueue():Rear(NULL),Front(NULL){}//构造函数
~LinkedQueue(){MakeEmpty();}//析构函数
bool EnQueue(int x);//入队
bool DeQueue();//出队
bool GetFront();//取队首元素
void MakeEmpty();//队列置空
bool IsEmpty() const{return (Front==NULL)?true:false;}//队列判空
int GetSize();//求队列长度
};
void LinkedQueue::MakeEmpty(){
//释放链表中所有节点
QueueNode *p;
while (Front!=NULL){
//逐个释放节点
p = Front;
Front = Front->link;//从链上摘下
delete p;//释放
}
};
//入队
bool LinkedQueue::EnQueue(int x){
if(Front==NULL){
//创建第一个节点
Front = Rear = new QueueNode(x);
if(Front==NULL) return false;//分配失败
}
else{
//队列不空,插入
Rear->link = new QueueNode(x);
if(Rear->link==NULL) return false;//分配失败
Rear = Rear->link;
}
return true;
};
//出队
bool LinkedQueue::DeQueue() {
if (IsEmpty() == true) return false;//判队空
QueueNode *p = Front;
int x = Front->data;
Front = Front->link;
cout<<"出队元素:"<data;
cout<<"队首元素:"<link;
}
return k;
};
测试:
int main()
{
LinkedQueue lq;
for(int i=1;i<=10;i++){
lq.EnQueue(i);
}
lq.GetFront();
int sz = lq.GetSize();
cout<<"队列大小:"<
结果: