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

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

一、什么是队列(Queue)

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

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

  • 数据对象集: 一个有0个或多个元素的有穷线性表。
  • 操作集: 长度为MaxSize的队列,队列元素
操作 含义
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 
#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 
#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;
}

你可能感兴趣的:(大师兄的数据结构学习笔记(三):队列)