QueueToStack

1 使用队列实现栈

1.1 问题分析

本质为,用队列“先进先出”的特性实现栈“后进先出”的特性!

1.2 解决方案设计

在这里插入图片描述

1.3 实现思路

在这里插入图片描述

1.4 代码实现

QueueToStack.h:

#ifndef QUEUETOSTACK_H
#define QUEUETOSTACK_H

#include "LinkQueue.h"
#include "Stack.h"

namespace LemonLib {
template <typename T>
class QueueToStack : public Stack<T>
{
protected:
    LinkQueue<T> m_queue1;
    LinkQueue<T> m_queue2;
    LinkQueue<T>* m_queue_in;
    LinkQueue<T>* m_queue_out;

    void move() const
    {
        int len = m_queue_in->size() - 1;

        while (len > 0)
        {
            m_queue_out->add(m_queue_in->front());
            m_queue_in->remove();
            len--;
        }
    }

    void swap()
    {
        LinkQueue<T>* tmp;

        tmp = m_queue_in;
        m_queue_in = m_queue_out;
        m_queue_out = tmp;
    }

public:
    QueueToStack()
    {
        m_queue_in = &m_queue1;
        m_queue_out = &m_queue2;
    }

    void push(const T& e)
    {
        m_queue_in->add(e);
    }

    void pop()
    {
        move();

        if (m_queue_in->size() > 0)
        {
            m_queue_in->remove();
            swap();
        }
        else
        {
            THROW_EXCEPTION(InvalidOperationException, "queue to stack pop error, stack is empty");
        }
    }

    T top() const
    {
        move();

        if (m_queue_in->size() > 0)
        {
            return m_queue_in->front();
        }
        else
        {
            THROW_EXCEPTION(InvalidOperationException, "queue to stack top error, stack is empty");
        }
    }

    int size() const
    {
        return m_queue_in->size() + m_queue_out->size();
    }

    void clear()
    {
        m_queue_in->clear();
        m_queue_out->clear();
    }
};
}

#endif // QUEUETOSTACK_H

1.5 分析

使用的队列实现栈的方式时间复杂度出现了很多个O(n),所以无实际工程意义。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值