数据结构(08)_队列和栈的相互实现

发布时间:2020-04-09 22:28:17 作者:三九感冒灵
来源:网络 阅读:485

1. 栈的队列的相互实现

思考:栈和队列在实现上非常相似,能否用相互实现?

1.1. StackToQueue

用栈实现队列等价于用“后进先出”的特性实现“先进先出”的特性.
数据结构(08)_队列和栈的相互实现
实现思路:

template < typename T >
class StackToQueue : public Queue<T>
{
protected:
    mutable LinkStack<T> m_stack_in;
    mutable LinkStack<T> m_stack_out;

    void move() const   //O(n)
    {
        if(m_stack_out.size() == 0)
        {
            while(m_stack_in.size() > 0)
            {
                m_stack_out.push(m_stack_in.top());
                m_stack_in.pop();
            }
        }
    }
public:
    void enqueue(const T& e) //O(1)
    {
        m_stack_in.push(e);
    }

    void dequeue()  //O(n)
    {
        move();

        if(m_stack_out.size() > 0)
        {
            m_stack_out.pop();
        }
        else
        {
            THROW_EXCEPTION(InvalidOperationException, "no element in current StackToQueue...");
        }
    }

    T front() const //O(n)
    {
        move();

        if(m_stack_out.size() > 0)
        {
            return m_stack_out.top();
        }
        else
        {
            THROW_EXCEPTION(InvalidOperationException, "no element in current StackToQueue...");
        }
    }

    void clear()    // O(n)
    {
        m_stack_in.clear();
        m_stack_out.clear();
    }

    int length() const  //O(n)
    {
        return m_stack_in.size() + m_stack_out.size();
    }
};

评价:
虽然可以使用栈实现队列,但是相比直接使用链表实现队列,在出队和获取对头元素的操作中,时间复杂度都变为了O(n),可以说并不高效。

1.2.QueueToStack

使用队列实现栈,本质上就是使用“先进先出”的特性实现栈“后进先出”的特性。
数据结构(08)_队列和栈的相互实现
实现思路:

template < typename T >
class QueueToStack : public Stack<T>
{
protected:
    LinkQueue<T> m_queue_in;
    LinkQueue<T> m_queue_out;
    LinkQueue<T>* m_qIn;
    LinkQueue<T>* m_qOut;

    void move() const   //O(n)
    {
        while(m_qIn->length()-1 > 0)
        {
            m_qOut->enqueue(m_qIn->front());
            m_qIn->dequeue();
        }
    }

    void swap()     //O(1)
    {
        LinkQueue<T>* temp = NULL;

        temp = m_qIn;
        m_qIn = m_qOut;
        m_qOut = temp;
    }
public:
    QueueToStack()  //O(1)
    {
        m_qIn  = &m_queue_in;
        m_qOut = &m_queue_out;
    }

    void push(const T& e)   //O(n)
    {
        m_qIn->enqueue(e);
    }

    void pop()      //O(n)
    {
        if(m_qIn->length() > 0)
        {
            move();
            m_qIn->dequeue();
            swap();
        }
        else
        {
            THROW_EXCEPTION(InvalidOperationException, "no element in current QueueToStack...");
        }
    }

    T top() const       //O(n)
    {
        if(m_qIn->length() > 0)
        {
            move();
            return m_qIn->front();
        }
        else
        {
            THROW_EXCEPTION(InvalidOperationException, "no element in current QueueToStack...");
        }
    }

    void clear()        //O(n)
    {
        m_qIn->clear();
        m_qOut->clear();
    }

    int size() const    //O(1)
    {
        return m_qIn->length() + m_qOut->length();
    }
};

总结评价:
虽然可以使用队列实现栈,但是相比直接使用链表实现栈,入栈、出栈、获取栈顶元素操作中,时间复杂度都变为了O(n),可以说并不高效。

推荐阅读:
  1. 代码面试需要知道的8种数据结构(附面试题及答案链接)
  2. 手撕数据结构与算法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

数据结构 队列

上一篇:JAVA程序员为什么拿不到想要的offer这些原因你都了解吗

下一篇:MySQL Text类型不是万能的

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》