数据结构:队列ADT的实现

队列是一种特殊的线性表,数据元素之间是线性关系,其插入和删除操作分别在两边进行,一端只能插入,另一端只能删除。

队首(front):进行删除操作的一端;

队尾(rear):进行插入操作的一端;

入队:在队尾插入一个元素;

出队:在队首插入一个元素;

特性:元素的操作顺序符合“先进先出(FIFO)”或“后进后出(LILO)”。

我以链式队列为例子讲解队列的一般操作。

链式队列的存储方式同一般的链式表的存储结构完全相同;队列与栈不同的是,队列两端都有操作,为了方便,需要设置两个指示器(front和rear),而栈只在一端操作,只需要一个指示器。

数据结构:队列ADT的实现_第1张图片

接下来说一下链式队列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<<"队列大小:"<

结果:

数据结构:队列ADT的实现_第2张图片

你可能感兴趣的:(学习笔记)