数据结构 - 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;
    }

};
相关推荐
mmmmath_32 小时前
LeetCode.199.二叉树的右视图
数据结构·leetcode
Shaoshing8 小时前
前缀和与差分
java·数据结构·算法·前缀和·差分
mmmmath_38 小时前
LeetCode.429.N叉树的层序遍历
数据结构·leetcode
suhan9 小时前
【数据结构】三、栈和队列:6.链队列、双端队列、队列的应用(树的层次遍历、广度优先BFS、先来先服务FCFS)
数据结构·后端·算法
suhan9 小时前
【数据结构】三、栈和队列:5.顺序队列(循环队列)(初始化,判空判满,入队,出队,实例)
数据结构·后端·算法
suhan9 小时前
【数据结构】三、栈和队列:3.链栈(链栈栈的初始化,判空,进栈,出栈,读取栈顶,链栈实例)
数据结构·后端·算法
suhan9 小时前
【数据结构】三、栈和队列:4.栈的应用(括号匹配,四则运算表达式求值,进制转换,递归)
数据结构·后端·算法
suhan9 小时前
【数据结构】三、栈和队列:2.顺序栈&共享栈(顺序栈的初始化,判空,进栈,出栈,读取栈顶,顺序栈实例)
数据结构·后端·算法
SelectDB10 小时前
部署形态与存算分离速查:形态对照、配置项清单与关键命令片段
大数据·数据结构·数据库
0+11111 小时前
算法 --哈希表
数据结构·算法·散列表