数据结构 - C/C++ - 队列

结构特性

  • 队列是一种特殊的线性表,限制在表的一端进行插入、在表的另一端进行删除。

    • 表中允许插入的一端称为队尾(rear) - 进队 | 入队

    • 表中允许删除的一端称为队头(front) - 退队 | 出队

  • 先进先出(first in first out - FIFO) - 队列中先进入的元素最先出队。

结构实现

  • 静态队列 - 基于数组 - 顺序存储

  • 动态队列 - 基于链表 - 链式存储

结构容器

  • queue

  • deque

结构设计

  • 顺序存储

  • 链式存储

cpp 复制代码
class Node
{
public:
    int value;
    Node* Next;
    Node(int Num) : value(Num), Next(nullptr) {}
};

class Queue
{
public:
    Node* front;
    Node* rear;
    int size;

public:
    Queue() : front(nullptr) , rear(nullptr), size(0) {}
    ~Queue()
    {
        Clear();
    }


public:
    int GetSize()
    {
        return size;
    }
    bool IsEmpty()
    {
        return size == 0;
    }
    void Clear()
    {
        Node* node = front;
        while (node)
        {
            Node* temp = node;
            node = node->Next;
            delete temp;
        }
    }

public:
    void Push(int value)
    {
        Node* node = new Node(value);
        if (front == nullptr)
        {
            front = node;
            rear = node;
        }
        else
        {
            rear->Next = node;
            rear = node;
        }

        size++;
    }
    int Pop()
    {
        if (IsEmpty()) return 0;

        int RetValue = GetFront();

        Node* node = front;
        front = front->Next;
        delete node;

        size--;

        return RetValue;
    }
    int GetFront()
    {
        if (this->front)
        {
            return this->front->value;
        }

        return -1;
    }
    int GetRear()
    {
        if (this->rear)
        {
            return this->rear->value;
        }
        return - 1;
    }
};
  • 双端队列
cpp 复制代码
#include <iostream>

class Node
{
public:
    int value;
    Node* Prev;
    Node* Next;
    Node(int value) : value(value), Prev(nullptr), Next(nullptr) {}
};

class Deque
{
public:
    Node* front;
    Node* rear;
    int size;

public:
    Deque(): front(nullptr), rear(nullptr), size(0) 
    {

    }
    ~Deque()
    {
        Node* node = front;
        while (node)
        {
            Node* temp = node;
            node = node->Next;
            delete temp;
        }
    }

public:
    int GetSize()
    {
        return this->size;
    }
    bool IsEmpty()
    {
        return this->size == 0;
    }

public:
    void PushFornt(int value)
    {
        Node* node = new Node(value);

        if (IsEmpty())
        {
            front = rear = node;
        }
        else
        {
            node->Prev = nullptr;
            node->Next = front;
            front->Prev = node;
            front = node;
        }

        size++;
    }
    void PushRear(int value)
    {
        Node* node = new Node(value);

        if (IsEmpty())
        {
            front = rear = node;
        }
        else
        {
            node->Next = nullptr;
            node->Prev = rear;
            rear->Next = node;          
            rear = node;
        }
        size++;
    }

    int PopFront()
    {
        int Ret = 0;

        if (IsEmpty())
        {
            return -1;
        }
        else
        {
            Ret = this->front->value;
            Node* node = this->front->Next;
            if (node != nullptr)
            {
                node->Prev = nullptr;
            }
            delete front;
            front = node;
        }

        size--;
        return Ret;
    }
    int PopRear()
    {
        int Ret = 0;

        if (IsEmpty())
        {
            return -1;
        }
        else
        {
            Ret = this->rear->value;
            Node* node = this->rear->Prev;
            if (node != nullptr)
            {
                node->Next = nullptr;
            }

            delete rear;
            rear = node;
        }

        size--;
        return Ret;
    }

    int GetFront()
    {
        if (IsEmpty())
        {
            return -1;
        }
        return front->value;
    }
    int GetRear()
    {
        if (IsEmpty())
        {
            return -1;
        }
        return rear->value;
    }

};
相关推荐
PYSpring3 分钟前
数据结构-LRU缓存(C语言实现)
c语言·数据结构·缓存
Mr Aokey23 分钟前
双向无头非循环链表的简单实现及介绍
数据结构
狐小粟同学2 小时前
链表面试编程题
数据结构·链表·面试
CyberMuse2 小时前
数值计算的程序设计问题举例
数据结构
陈奕迅本讯2 小时前
数据结构-链表笔记
数据结构·笔记·链表
江奖蒋犟3 小时前
【初阶数据结构】排序——归并排序
c语言·数据结构·算法
cdut_suye3 小时前
STL之list篇(下)(从底层分析实现list容器,逐步剥开list的外表)
开发语言·数据结构·c++·学习·算法·stl·list
Felix Du3 小时前
数据结构与算法(七)静态链表
c语言·数据结构·学习·算法·链表
所待.3834 小时前
设计循环队列
java·开发语言·数据结构
无聊看看天T^T6 小时前
网络基础:TCP/IP五层模型、数据在局域网传输和跨网络传输的基本流程、IP地址与MAC地址的简单解析
网络·数据结构·c++·网络协议·tcp/ip·算法