zoukankan      html  css  js  c++  java
  • 不可变队列

        实现一个高效的不可变队列,队列有enqueue和dequeue,分别从队列push、pop一个元素,并返回新队列。原有队列保持不变。

    template<typename T>
    class const_queue
    {
    public:
        const_queue()
            : m_nFrontIdx(0),
            m_nEndIdx(0),
            m_pdqData(new deque<T>())
        {
     
        }
     
        const_queue<T> enqueue(T t) const
        {
            // Share data.
            if (m_pdqData->size() == m_nEndIdx)
            {
                const_queue q(*this);
     
                q.m_pdqData->push_back(t);
                q.m_nFrontIdx = m_nFrontIdx;
                q.m_nEndIdx = m_nEndIdx + 1;
     
                return q;
            }
            // Copy data, share failed.
            else
            {
                const_queue q;
                deque<T> dq(
                    m_pdqData->begin() + m_nFrontIdx, 
                    m_pdqData->begin() + m_nEndIdx);
     
                q.m_pdqData->swap(dq);
                q.m_pdqData->push_back(t);
                q.m_nFrontIdx = 0;
                q.m_nEndIdx = m_nEndIdx - m_nFrontIdx + 1;
     
                return q;
            }
        }
     
        const_queue<T> dequeue() const
        {
            // Share data.
            const_queue q(*this);
     
            q.m_nFrontIdx = m_nFrontIdx + 1;
            q.m_nEndIdx = m_nEndIdx;
     
            return q;
        }
     
        T peek() const
        {
            if (!isEmpty())
            {
                return m_pdqData->at(m_nFrontIdx);
            }
     
            throw "const_queue is empty";
        }
     
        size_t size() const
        {
            if (!isEmpty())
            {
                return m_nEndIdx - m_nFrontIdx;
            }
     
            return 0;
        }
     
        bool isEmpty() const
        {
            return m_nEndIdx <= m_nFrontIdx;
        }
     
    private:
        size_t m_nFrontIdx;
        size_t m_nEndIdx;
        shared_ptr<deque<T> > m_pdqData;
    };
     
    void test()
    {
        const_queue<int> q;
     
        const_queue<int> q1 = q.enqueue(1);
        cout << q1.size() << " " << q1.peek() << endl;
        const_queue<int> q2 = q.enqueue(2);
        cout << q2.size() << " " << q2.peek() << endl;
        const_queue<int> q3 = q1.enqueue(3);
        cout << q3.size() << " " << q3.peek() << endl;
        const_queue<int> q4 = q3.dequeue();
        cout << q4.size() << " " << q4.peek() << endl;
        const_queue<int> q5 = q2.enqueue(4);
        cout << q5.size() << " " << q5.peek() << endl;
     
        cout << q1.size() << " " << q1.peek() << endl;
        cout << q2.size() << " " << q2.peek() << endl;
        cout << q3.size() << " " << q3.peek() << endl;
        cout << q4.size() << " " << q4.peek() << endl;
        cout << q5.size() << " " << q5.peek() << endl;
    }
  • 相关阅读:
    [LeetCode]10. Regular Expression Matching
    [LeetCode]9. Palindrome Number
    [LeetCode]8. String to Integer (atoi)
    javascript 内部函数的定义及调用
    canvas和白鹭引擎中平移,旋转,缩放
    改变this指向的call,apply,bind方法
    关于JavaScript中this小有理解
    关于位运算符的计算法方法
    制作简单的GIF动图
    HTML中的单位小结
  • 原文地址:https://www.cnblogs.com/codingmylife/p/2710898.html
Copyright © 2011-2022 走看看