数据结构(四)、C++数组实现队列

数组实现队列

1、实现原理

通过操作数组的下标来实现队列结构。
栈数组结构体定义:

    const int queue_size = 10;
    template<class T>
    class Queue
    {
    public:
        std::array<T, queue_size> m_que{}; // 队列
        int m_fornt{ -1 };                 // 头标识
        int m_fear{ -1 };                  // 尾标识
    }

(1)、入队实操说明

  • 插入元素(1)
        /*
               队列数组arr
               --------------------------------------------------------------
               |   0   |   0  |   0  |   0   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |-1   |-1
          m_fornt  m_fear
                                             ||
                                             ||  m_fornt = m_fear = 0
                                            \\//
               队列数组arr
               --------------------------------------------------------------
               |   1   |   0  |   0  |   0   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |0    |0
          m_fornt  m_fear
        */
  • 插入元素(2)
        /*
               队列数组arr
               --------------------------------------------------------------
               |   1   |   0  |   0  |   0   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |0   |0
          m_fornt  m_fear
                                             ||
                                             ||   m_fear++
                                            \\//
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   0  |   0   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |0         |1
          m_fornt       m_fear
        */
  • 插入元素(3)
        /*
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   0  |   0   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |0         |1
          m_fornt       m_fear
                                             ||
                                             ||   m_fear++
                                            \\//
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   0   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |0                |2
          m_fornt              m_fear
        */
  • 插入元素(4)
        /*
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   0   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |0                |2
          m_fornt              m_fear
                                             ||
                                             ||   m_fear++
                                            \\//
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   4   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |0                        |3
          m_fornt                      m_fear
        */

(2)、出队实操说明

  • 移除首元素(1)
        /*
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   4   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |0                        |3
          m_fornt                      m_fear
                                             ||
                                             ||   m_fornt++
                                            \\//
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   4   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
                          |1             |3
                     m_fornt           m_fear
        */
  • 移除首元素(2)
        /*
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   4   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
                          |1             |3
                     m_fornt           m_fear
                                             ||
                                             ||   m_fornt++
                                            \\//
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   4   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
                                 |2     |3
                            m_fornt   m_fear
        */
  • 移除首元素(3)
        /*
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   4   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
                                 |2     |3
                            m_fornt   m_fear
                                             ||
                                             ||   m_fornt++
                                            \\//
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   4   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
                                      |3    |3
                                 m_fornt  m_fear
        */
  • 移除首元素(4)
        /*
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   4   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
                                      |3    |3
                                 m_fornt  m_fear
                                             ||
                                             ||   m_fornt = m_fear = -1
                                            \\//
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   4   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |-1  |-1
          m_fornt  m_fear
        */

(3)、打印实操说明

遍历从m_fornt位置开始到m_fear位置结束,依次输出数组

        /*
                队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   4   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |0                        |3
          m_fornt                      m_fear

          遍历从m_fornt位置开始到m_fear位置结束,依次输出数组
        */

(4)、整体代码

#include <iostream>
#include <array>

namespace queue_array
{
    const int queue_size = 10;
    template<class T>
    class Queue
    {
    public:
        std::array<T, queue_size> m_que{}; // 队列
        int m_fornt{ -1 };                 // 头标识
        int m_fear{ -1 };                  // 尾标识

        /**
         * @brief 插入
         */
        void push(T m_pData)
        {
            if(m_fear == m_que.size() - 1)
            {
                std::cout << "queue 已满." << std::endl;
            }
            else if (m_fornt == -1 && m_fear == -1)
            {
                m_fornt = m_fear = 0;
                m_que.at(m_fear) = m_pData;
            }
            else if (m_fear < m_que.size())
            {
                m_fear++;
                m_que.at(m_fear) = m_pData;
            }
        }

        /**
         * @brief 删除
         */
        void pop()
        {
            if (isEmpty())
            {
                std::cout << "queue isempty()" << std::endl;
            }
            if (m_fornt == m_fear)
            {
                m_fornt = m_fear = -1;
            }
            else
            {
                m_fornt++;
            }
        }

        /**
         * @brief 打印
         */
        void print_queue()
        {
            if (isEmpty())
            {
                std::cout << "queue isempty()" << std::endl;
                return;
            }
            for (int i = m_fornt; i < m_fear; ++i)
            {
                std::cout << m_que[i] << " ";
            }
            std::cout << std::endl;
        }

        /**
         * @brief 判空
         */
        bool isEmpty() { return (m_fornt == -1); }

        /**
         * @brief 大小
         */
        int size() { return (m_fear - m_fornt); }
    };

    void test_queue_array()
    {
        queue_array::Queue<int> m_queue;
        m_queue.push(1);
        /*
               队列数组arr
               --------------------------------------------------------------
               |   0   |   0  |   0  |   0   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |-1   |-1
          m_fornt  m_fear
                                             ||
                                             ||  m_fornt = m_fear = 0
                                            \\//
               队列数组arr
               --------------------------------------------------------------
               |   1   |   0  |   0  |   0   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |0    |0
          m_fornt  m_fear
        */

        m_queue.push(2);
        /*
               队列数组arr
               --------------------------------------------------------------
               |   1   |   0  |   0  |   0   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |0   |0
          m_fornt  m_fear
                                             ||
                                             ||   m_fear++
                                            \\//
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   0  |   0   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |0         |1
          m_fornt       m_fear
        */

        m_queue.push(3);
        /*
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   0  |   0   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |0         |1
          m_fornt       m_fear
                                             ||
                                             ||   m_fear++
                                            \\//
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   0   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |0                |2
          m_fornt              m_fear
        */

        m_queue.push(4);
        /*
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   0   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |0                |2
          m_fornt              m_fear
                                             ||
                                             ||   m_fear++
                                            \\//
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   4   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |0                        |3
          m_fornt                      m_fear
        */

        m_queue.print_queue();
        /*
                队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   4   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |0                        |3
          m_fornt                      m_fear

          遍历从m_fornt位置开始到m_fear位置结束,依次输出数组
        */

        cout << "queue.size()=" << m_queue.size() << endl;

        m_queue.pop();
        /*
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   4   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |0                        |3
          m_fornt                      m_fear
                                             ||
                                             ||   m_fornt++
                                            \\//
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   4   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
                          |1             |3
                     m_fornt           m_fear
        */

        m_queue.print_queue();
        cout << "queue.size()=" << m_queue.size() << endl;

        m_queue.pop();
        /*
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   4   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
                          |1             |3
                     m_fornt           m_fear
                                             ||
                                             ||   m_fornt++
                                            \\//
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   4   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
                                 |2     |3
                            m_fornt   m_fear
        */

        m_queue.print_queue();
        cout << "queue.size()=" << m_queue.size() << endl;

        m_queue.pop();
        /*
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   4   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
                                 |2     |3
                            m_fornt   m_fear
                                             ||
                                             ||   m_fornt++
                                            \\//
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   4   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
                                      |3    |3
                                 m_fornt  m_fear
        */

        m_queue.print_queue();
        cout << "queue.size()=" << m_queue.size() << endl;

        m_queue.pop();
        /*
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   4   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
                                      |3    |3
                                 m_fornt  m_fear
                                             ||
                                             ||   m_fornt = m_fear = -1
                                            \\//
               队列数组arr
               --------------------------------------------------------------
               |   1   |   2  |   3  |   4   |   0   |   0   |  ...  |   0  |
               --------------------------------------------------------------
               |-1  |-1
          m_fornt  m_fear
        */

        m_queue.print_queue();
        cout << "queue.size()=" << m_queue.size() << endl;

        m_queue.pop();
        m_queue.print_queue();
        cout << "queue.size()=" << m_queue.size() << endl;
    }

}// namespace queue_array

int main()
{
    queue_array::test_queue_array();
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值