美文网首页
大师兄的数据结构学习笔记(三):队列

大师兄的数据结构学习笔记(三):队列

作者: superkmi | 来源:发表于2020-10-10 17:00 被阅读0次

    大师兄的数据结构学习笔记(二):线性结构
    大师兄的数据结构学习笔记(四):树结构

    一、什么是队列(Queue)

    • 队列是具有一定操作约束的线性表。
    • 只在一端(队尾)插入/入队列,在另一端(队头)删除/出队列。
    • 先入先出:First In First OUT (FIFO)。

    二、队列的抽象数据类型描述

    • 数据对象集: 一个有0个或多个元素的有穷线性表。
    • 操作集: 长度为MaxSize的队列Q\in Queue,队列元素item\in ElementType
    操作 含义
    Queue CreateQueue(int MaxSize) 生成长度为MaxSize的空队列。
    int IsFull(Queue Q,int MaxSIze) 判断队列Q是否已满。
    void AddQ(Queue Q,ElementType item) 将数据元素item插入队列Q中。
    int IsEmpty(Stack S) 判断队列Q是否为空。
    ElementType DeleteQ(Queue Q) 将队头数据元素从队列中删除并返回。

    三、队列的顺序存储实现

    • 队列的顺序存储通常由一个一维数组、一个记录队列头元素位置的变量front、一个记录队列尾元素位置的变量rear组成。
    #ifndef QUEUE_H
    #define QUEUE_H
    typedef int DataType;
    
    const int MaxSize = 100;
    
    class Queue
    {
    public:
        Queue() {};                             //生成长度为MaxSize的空队列
        bool IsFull();      //判断队列Q是否已满
        void AddQ(DataType item);   //将数据元素item插入队列Q中
        bool IsEmpty();                 //判断队列Q是否为空
        DataType DeleteQ();             //将队头数据元素从队列中删除并返回
    private:
        DataType data[MaxSize];
        int front;
        int rear;
    };
    #endif
    
    #include <iostream>
    #include "Queue.h"
    using namespace std;
    
    bool Queue::IsFull()
    {
        //判断队列Q是否已满
        if ((rear + 1) % MaxSize == front) {
            return true;
        }
        return false;
    }
    
    bool Queue::IsEmpty()
    {
        //判断队列Q是否为空
        if (rear == front)
        {
            return true;
        }
        return false;
    }
    
    void Queue::AddQ(DataType item)
    {
        //将数据元素item插入队列Q中
        if (IsFull())
        {
            printf("Queue is full!");
            return;
        }
        rear = (rear + 1) % MaxSize;
        data[rear] = item;
    }
    
    DataType Queue::DeleteQ()
    {
        //将队头数据元素从队列中删除并返回
        if (IsEmpty())
        {
            printf("Queue is empty!");
            return 0;
        }
        else {
            front = (front + 1) % MaxSize;
            return data[front];
        }
    }
    

    四、队列的链式存储实现

    • 用一个单链表实现,链表头作为front,链表末尾作为rear。


    #ifndef QUEUE_H
    #define QUEUE_H
    typedef int DataType;
    
    typedef struct Node {
        //链表数据结构
        DataType Data;
        struct Node *Next;
    }QNode;
    
    class Queue
    {
    public:
        Queue() {};                 //构造函数
        void AddQ(DataType item);   //将数据元素item插入队列Q中
        bool IsEmpty();             //判断队列Q是否为空
        DataType DeleteQ();         //将队头数据元素从队列中删除并返回
    private:
        //链表队列结构
        QNode *front;
        QNode *rear;
    };
    #endif
    
    #include <iostream>
    #include "Queue.h"
    using namespace std;
    
    bool Queue::IsEmpty()
    {
        //判断队列Q是否为空
        if (front==nullptr)
        {
            return true;
        }
        return false;
    }
    
    void Queue::AddQ(DataType item)
    {
        //将数据元素item插入链表尾部
        QNode* RearCell = new QNode;
        RearCell->Data = item;
        RearCell->Next = nullptr;
    
        if (IsEmpty())
            rear = front = RearCell;
        else  
            rear->Next = RearCell;
            rear = RearCell;
    }   
    
    DataType Queue::DeleteQ()
    {
        //将队头数据元素从队列中删除并返回
        QNode *FrontCell;
        DataType FrontElem;
    
        if (IsEmpty())
        {
            printf("Queue is empty!");
            return 0;
        }
        FrontCell = front;
        if (front == rear)
            //如果只有一个元素,表头为空
            front = nullptr;
        else
            //如果超过一个元素,则指向上一个元素并释放当前元素空间
            front = front->Next;
        FrontElem = FrontCell->Data;
        free(FrontCell);
        return FrontElem;
    }
    

    相关文章

      网友评论

          本文标题:大师兄的数据结构学习笔记(三):队列

          本文链接:https://www.haomeiwen.com/subject/eankpktx.html